转换测试信息的测试是有害
来源:互联网 发布:中国网络直播排行榜 编辑:程序博客网 时间: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)、MD5、SHA家族等。
简单理解:
- 转换测试信息的测试是有害
- 这是一个测试信息
- 为什么继承是有害的
- 为什么继承是有害的?
- WSGI中间件是有害的
- Byzantine容错是有害的
- 渗透性测试是一种特殊的信息安全服务
- 测试主机的信息
- 这是测试的
- 为什么extends是有害的(二)
- 为什么extends是有害的(一)
- 为什么extends是有害的(一)
- 为什么extends是有害的(二)
- 为什么Java中继承是有害的
- 为什么Java中继承是有害的
- 为什么Java中继承是有害的?
- “用户需求”这个概念是有害的
- 自动化测试是测试人员的遮羞布?
- 多态在 Java 和 C++ 编程语言中的实现比较
- 洛谷 2055 假期的宿舍
- Windows 10 安装 rJava
- QSS --- 360主按钮样式
- 高德地图 JavaScript API v1.3 开发(多点标记、自定义坐标点、信息窗口、导航)(demo)
- 转换测试信息的测试是有害
- 进程调度之SPF
- 抽象类和接口的区别
- leetcode GrayCode C++
- 【原创】Intellij Idea 返回上次编辑快捷键设置
- 基于测试行为,而不是测试实现
- 利用sql改写去掉执行计划中的filter
- Yii2修改配置文件识别post过来的json数据
- 『python学习』Python核心编程——面向对象编程