一个非常简单的测试驱动开发教程

现在,我沉迷于测试驱动开发,但是...在过去的某个地方,我认为这是个糟糕的主意。 现在,没有这种技术我将无法开发任何代码。

在这篇文章中,我将介绍一些在日常工作中开始使用TDD的步骤。

技巧

技巧1: 要知道你必须要使用哪些工具

你使用哪种语言?我主要使用Java工作,多年来我从未听说过Maven以及如何将Maven与JUnit集成。因此,没有Maven或Gradle或任何其他构建工具的JUnit什么也不是!在我工作的公司里,没有一个人是kwen专家或任何建筑工具……这是一种业余的手工软件。

当我被介绍给Maven时,我自己使用Gradle几年后,我只问:“好。它可以进行构建,运行测试并使应用程序可部署吗?“。那是我要找的东西!

当开始一个新项目时,请制定一个路线图:

  1. 设置构建工具:Java Maven或Gradle
  2. 配置测试工具:为什么不使用JUnit 5
  3. 使用断言创建您的第一个测试,并检查是否有效!

技巧2: 了解TDD周期

红色,绿色,重构!这有道理吗?不,所以请阅读!这就是您将使用TDD开发的方式。编写下降测试,编写使测试正常工作并重构的代码。

在测试工作之前,请不要担心重复的代码,难闻的气味或您的代码好美! 只是解决问题。 现在还不是时候。

迈出小步。 不用担心在测试之前编写完整功能。 测试代码的每一步。 如果要在数据库上保存一个实体,请先保存它,然后测试该实体的每种输入,然后编写所有业务规则。 编写完整的功能然后进行测试是浪费时间。 采取一些小步骤,您可以在错误变得更严重之前进行修复,并确保一个小时前编写的代码运行良好。

技巧3: 验证代码

通过考试是什么意思? 对于与之合作的开发团队,这意味着至少要提供80%的覆盖率报告! 那是对的吗? 没有! 您应该验证自己所做的事情。


User user = givenUser();
userService.createUser(user); // here I have 100% of Code Coverage

List users = userService.list();
assertThat(users).hasSize(1) // But I do not know if it was save
                 .allMatch(this::passwordIsEncrypted); // And if the password is correctly encrypted

技巧4: 了解好的测试库

Mockito,AssertJ,To String Verifier等...这将为您提供帮助。 相信我! 不要重新发明一个库,要重复使用。 会有很多很好的测试库。

技巧5: 组织测试代码

编写您的生产代码,来考虑可以测试谁。

假设您有一个包含许多服务使用者和提供者的代码(Kafka、MQ、Aws、谷歌*等)。 每次创建新的生产者或消费者时,都应使用同一段代码创建它! 当您这样做时,很容易为此类创建一个Mock。 如果您有一个KafkaClientFactory,则确实需要担心新的KafkaProducer,只需使用Mockito模拟KafkaClientFactory就可以了

如何建立一个单例?


public class SomeSingleton {

    private static final instance AtomicReference ref = new AtomicReference<>();

    public static SomeSingleton get() {
        return instance.updateAndGet(e -> {
            return isNull(e) ? new SomeSingleton() : e;
        });
    }
}

这个实现好吗?不!为什么?如果我想清理这个单例并重新创建?我怎么能存取字段参考?你不能!您必须使用选项,或者您让字段ref作为一个包私有的,或者您创建一个清理方法作为包私有的,并在同一个包中创建一个SomeSingletonHelper作为代码测试来重置所有值。

其目的是思考,在编写代码时如何测试我的代码。

技巧6: 知道输入和输出

创建测试时,应该知道代码将接收到的输入类型以及应该提供的输出类型。 使用已知的输入,不仅自动生成。 这可以帮助您确保其正常工作

技巧7: 使用真实的输入

使用真实输入,不仅要使用生成的/虚拟输入。 发现生产错误? 获取产生错误的输入,并使用它进行测试!

技巧8: 测试语言

为您的代码创建一个测试DSL。


User user = new User();
user.setName(randomString());
user.setPassword(randomString());
userService.create(user)

List allUsers = userService.list();
assertThat(allUsers).hasSize(1);

将下面的代码与下面的代码进行比较


userService.create(givenRandonUser())

assertThat(thenAllUsers()).hasSize(1);

为您的代码构建一个高级的“时时给定”库

总结

测试不是浪费时间! 当您从未做过TDD时,您会想到的,但是有了TDD,您可以更好地利用自己的时间。

原文链接: https://dev.to//vepo/a-very-simple-test-driven-development-tutorial-3309

你可能感兴趣的:(一个非常简单的测试驱动开发教程)