现在的开发规范中多多少少会要求写单元测试。对单元测试的态度大家也分化的比较严重,有些人觉得单元测试没有用,根本就是浪费时间。有些人就特别的舔单元测试,甚至坚持TDD, 比如 pshu 本人????。
作为一个更加疯狂的 TDD 舔狗,pshu想对那些说单元测试没啥用的同学喊几句话。觉得单元测试没有用的同学,是你没有用正确的姿势来写测试。而姿势不正确是因为你不了解单元测试。今天 pshu 将从单元测试“流派”的角度来让大家来了更加深入的了解单元测试,从而帮助大家写出更好的单元测试。
状态流
什么是状态流呢? 通过检查被测对象所影响的状态的方式来验证正确性的测试方式,就是状态流。可能大家第一次听说状态流,但是大部分的单元测试都在做这个流派的实践。主要原因就是大家一开始接触的就是这个流派,目前大部分的单元测试的教程所演示的第一个例子都是类似下面的代码。
assert(2, sum(1,1))
这就是一个典型的状态流的做法,通过检查 sum
函数返回值这个被测对象的状态是否为 ’2’ 来决定测试是否成功。这样的测试方式很直接,也很好理解。包括介绍 TDD 的经典例子保龄球算分的 demo,也是采用了状态流的做法。在状态流流派中最有名的一位选手就是 Robert C. Martin,人称 Uncle Bob。这位大叔(真的是大叔,已经 67 岁高龄了),是敏捷宣言的作者之一,当然 Uncle Bob 最有名还是他写的 《Clean code》 (整洁代码)和《Agile Software Development: Principles, Patterns, and Practices》(敏捷软件开发:原则、模式与实践)这两本书了。Uncle Bob 对状态流真是情有独钟。当然他对状态流的用法也非常的独到。比如我们要比较两个圆的是否一致的情况。
2B 青年会直接用assertTrue(cirlce1.equals(circle2))
从测试的角度看没有任何问题,但是当测试失败的时候。这样的状态流测试用例对查问题一点帮助都没有,只是冰冷的告诉你测试挂了。
一般青年会分别写三个断言,分别断言两个圆的圆心x,y和半径 r 是