转换测试信息的测试是有害

来源:互联网 发布:中国网络直播排行榜 编辑:程序博客网 时间:2024/05/04 07:58

作者:Alex Eagle

原文链接:http://googletesting.blogspot.com/2015/01/testing-on-toilet-change-detector-tests.html

(有时)你只是完成了重构代码,但是没有修改代码的实际行为。在提交之前你执行了测试,结果…一连串单元测试可能会失败。当修复这些测试的时候,你会发觉你其实在对大部分单元测试做相同的机械式的改造,这完全是浪费时间。或许你在一个方法中引入了一个参数,那现在就必须更新100个调用了该方法的单元测试,以传入一个空的字符串作为参数。

把单元测试写得机械化一般是怎样的呢?这里有一个可笑但是直观的示例:

// 产品代码:

def abs(i: Int)

return (i< 0) ? i * -1 : i

// 测试代码:

for (line: String in File(prod_source).read_lines())

switch (line.number)

1: assert line.content equals defabs(i: Int)

2: assert line.content equals  return (i< 0) ?i * -1 : i

该测试显然是无用的它在测试代码中完整复制了一段代码和行为,执行起来就像在做一个校验和[1]无论程序是否正确,都可能通过这个测试,这样的测试代码只能算得上是源码的衍生物。没有人真的会像这样编写测试,但跟下一个例子相比有什么不同?

//产品代码:
def process(w: Work)
firstPart.process(w)
secondPart.process(w)
//测试代码
part1 = mock(FirstPart)
part2 = mock(SecondPart)
w = Work()
Processor(part1, part2).process(w)
verify_in_order
was_calledpart1.process(w)
was_calledpart2.process(w)

我们试图去写一个这样的测试,因为它不用太多思考并且可以运行的很快。这是一个转换测试信息的测试—它对被测代码中的相同信息做了个转换—在没有验证原始代码或修改后的产品代码行为正确性的情况下,它能对产品代码的任何改变做出直接响应。

转换测试信息的测试能产生负面价值,因为测试没有发现任何缺陷,还增加了维护成本,减慢开发进度。这些测试应该被重写或者删除。

注释:

[1] 校验和:是冗余校验的一种形式。它是通过错误检测方法,对经过空间(如通信)或者时间(如计算机存储)传送的数据的完整性进行检查的一种简单方法。计算机领域常见的校验和的方法有循环冗余校验(CRC)、MD5SHA家族等。

简单理解:


0 0
原创粉丝点击