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

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

在这篇文章中,我将介绍一些在日常工作中开始使用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<User> 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<SomeSingleton> 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<User> 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【适合小白入门】深入掌握Windows操作系统原理,提升程序开发水平,为学习驱动开发,内核安全打下基础。学完本课程可以轻松的理解Windows内核,开阔思路,对没有底层开发基础的人起到有非常好的指导作用。在此基础上可以开发出有趣且功能强大的软件。 课程目录: 第1章windows驱动基础 第一课 认识windows驱动 第二课 在虚拟机里安装windows操作系统 第三课 windows操作系统基本概念 第四课 操作系统的分层结构 第2章windowsw驱动编译环境配置、安装及调试 第五课 安装驱动开发环境 第六课 安装驱动开发环境 第七课 实战:编写驱动程序加载器 第3章驱动程序的基本结构 第八课 复习c语言的指针和数据结构 第九课 windows驱动程序的基本结构 第十课 编程实战-创建设备对象 第4章windows内存管理 第十一课 内存管理操作 第十二课 驱动开发中使用链表 第十三课 驱动开发中使用快查表 第十四课 在驱动中使用c++中内存管理操作-newdelet 第十六课 驱动开发中宏与断言的使用 第5章应用程序与驱动程序通信 第二十六课 irp与派遣函数 第二十七课 缓冲区读写操作 第十五课 在驱动中使用结构化异常处理 第二十八课 缓冲区读写操作 第二十九课 模拟文件 第三十课 直接方式与其它方式读写操作 第三十一课 io设备控制操作 第三十二课 io设备控制操作 第6章windows内核函数 第十七课 内核模式下的字符串操作1 第十八课 内核模式下的字符串操作 第十九课 内核模式下的字符串操作 第二十课 内核模式下的文件操作 第二十一课 内核模式下的文件操作 第二十二课 内核模式下注册表操作 第二十三课 内核模式下注册表操作 第二十四课 内核模式下注册表操作 第二十五课 内核模式下注册表操作 第7章驱动程序的同步处理 第三十三课 内核模式下的同步与异步操作 第三十四课 用户模式下的同步对象1_事件 第三十五课 用户模式下的同步对象2_线程信号量与互斥体 第三十六课 内核模式下的同步对象3_系统线程创建与普 第三十七课 内核模式下的同步对象4_信号量与互斥体 第三十八课 内核模式与用户模式间的同步操作 第三十九课 其它内核同步要素 第8章IRP的同步与异步 第四十课 应用程序的对文件同步与异步操作 第四十一课 irp异步完成 第四十二课 irp的取消与startio函数 第四十三课 自定义startio函数 第9章定时器54分钟3节 第四十四课 io定时器与dpc定时器 第四十五课 内核模式下的等待操作 第四十六课 时间函数与irp超时处理 第10章驱动程序调用驱动程序1小时3节 第四十七课 通过设备句柄调用驱动程序 第四十八课 设备指针调用驱动程序 第四十九课 自定义irp与ObReferenceObject 第11章分层过滤驱动 第五十课 分层驱动:枚举设备栈上的设备对象 第五十一课 编写过滤驱动程序 第五十二课 irp完成函数 第12章驱动程序开发高级技能 第五十三课 驱动程序的兼容性 第五十五课 驱动调试之windbg与vmware 第五十六课 驱动调试vs vmware 第五十四课 驱动签名证书原理及制作 第五十七课 驱动调试神器virtualkd 第五十八课 汇编语言编写驱动之环境搭建 第五十九课 用汇编语言开发32与64位驱动程序

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值