怎么去做UTDD(单元测试驱动开发)

怎么去做UTDD

前言导入

        UTDD是一种敏捷软件开发的技术,那必然存在一套系统的理论知识,同样也正因为能落地实践才得以推广。
        对待理,我们只需要做到 ”拿来主义“ 开箱即用;对待实践,可看做是 ”拿来主义的本地化“。 只有理论+实践,我们才能做到 ”知行合一“

基础理论

UTDD基本流程

        一言蔽之:先编写单元测试用例,后编写程序逻辑代码。

        更具体些:编写一个让程序运行失败的单元测试用例 -> 编写让程序通过用例的程序逻辑代码 -> 重构单元测试用例、程序逻辑代码。

        更形象些:人们把上述UTDD基本流程,形象生动地表达为:红->绿 ->重构,一个完整闭环。

  •  如果你有写过单元测试的话,你应该知道 这些颜色的含义。当你运行单元测试用例失败时,集成开发环境IDEA的控制台会打印出 “红色”的错误信息;当 运行单元测试用例通过时,则会显示 “绿色”提示信息。

        类比想象:红 -> 绿 -> 重构 ,一个完整闭环。(闭环 -》 轮子、闭环 -》螺旋圈)

  •  软件开发过程, 比作 小汽车 由 道路的起点驶向终点的过程;UTDD完整闭环 比作 “车轮”,每走完一个UTDD基本流程,“车轮” 就 往前行驶了一圈,直至终点。
  • 同理,软件开发过程 可比作一个螺旋上升的过程,每走完一个UTDD基本流程,就上升了“一圈”。(体现了 增量开发 的视角)

UTDD三条原则

        当你采用UTDD这项技术时,为了能让你很好地按照UTDD基本流程进行程序开发,作者Knet Back定义了UTDD三条原则内容。(类似 敏捷宣言于敏捷的关系)

作者原版:

  英文原版:

  1. You are not allowed to write any production code unless it is to make a failing unit test pass.

  2. You are not allowed to write any more of a unit test than is sufficient to fail; and compilation failures are failures.

  3. You are not allowed to write any more production code than is sufficient to pass the one failing unit test.

  中文翻译:

  1. 除非为了使一个失败的单元测试通过,否则不允许编写任何产品代码。

  2. 在一个单元测试中只允许编写刚好能够导致失败的内容(编译错误也算失败)。

  3. 只允许编写刚好能够使一个失败的单元测试通过的产品代码。

如果违反了会怎么样呢?

  •  违反第一条,先编写了产品代码,那这段代码是为了实现什么需求呢?怎么确保它真的实现了呢?
  • 违反第二条,写了多个失败的测试,如果测试长时间不能通过,会增加开发者的压力,另外,测试可能会被重构,这时会增加测试的修改成本。
  • 违反第三条,产品代码实现了超出当前测试的功能,那么这部分代码就没有测试的保护,不知道是否正确,需要手工测试。可能这是不存在的需求,那就凭空增加了代码的复杂性。如果是存在的需求,那后面的测试写出来就会直接通过,破坏了 TDD 的节奏感。

个人改进:

        初读原版UTDD三条原则,给我的感觉是 “我以为我记住了,但我的大脑却说了‘不’。”,所以为了方便记忆,我对这三条原则进行了提炼和补充。

  1. 必须先编写 单元测试用例,后填充 程序逻辑代码,再重构 用例和代码。

  2. 一次只能编写 一个刚好运行失败的 单元测试用例

  3. 一次只能填充 一段刚好通过用例的 程序逻辑代码

  4. 频繁地去重构 杂乱不堪的单元测试用例程序逻辑代码(可选增添)

实践

        现在我们已基本熟知UTDD相关知识了,那接下来就该实践UTDD了。

UTDD实践工具

        “工欲善其事,必先利其器。” 在实践UTDD之前,我们需要找到能让UTDD落地、更好落地的工具。Java开发,推荐 UTDD工具集 = JUnit + AssertJ +Mockito

  • JUnit:一个Java语言的单元测试框架。用它来执行单元测试用例。

  • AssertJ:一个Java语言的流式断言器。用它来进行单元测试结果的断言。虽然Junit框架也自带断言方法,但奈何可选方法较少,且不如AssertJ断言方法使用起来 方便、优雅、语义化。

  • Mockito:一个Java语言的Mocking框架。用它来构造测试替身。因为在我们编写单元测试用例时,会使用到一些当前尚未实现 或 难以构造的对象,这时我们就可以通过Mockito 构造一个虚拟的对象,帮助我们完成单元测试工作。

      上述UTDD工具集的安装教程使用教程,可自行查阅网上资料实践,比较简单。(后续有时间再进行补充)

UTDD实践流程

        上述的基础理论的UTDD基本流程、UTDD三条原则,多是文字描述、有些抽象,依然让你无法开启你的UTDD之旅。下面这张图,可以很好的解决这一问题 ,你只需 “照葫芦画瓢“

 更多文章,请移步至:https://blog.csdn.net/qq_41998273/category_11699499.html

参考文章

《测试驱动开发》作者:Kent Beck
《测试驱动开发的艺术》作者:科斯凯拉 (Lasse Koskela)
《有效的单元测试》作者:科斯凯拉 (Lasse Koskela)
 深度解读 - TDD(测试驱动开发) - 简书

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值