81. 精密地、具体地测试

精密地、具体地测试

       测试代码单元所需的、基本的行为而不是测试特定实现的附加的行为是很重要的,但这不应该将其错误地用来作为含糊不清的测试的借口。测试既需要准确,又需要精密。
        排序是一个测试很有说明性的例子。实现一个排序算法不是程序员的日常工作中所必需的,但这是一个很为人熟知的概念,而且大多数人知道结果是什么。然而这种漫不经心的熟悉,会让人更难看到若干假定。
        当程序员被问到:“你会测试什么?”,最常见的回答无疑是“排序的结果是元素的有序序列。”这是对的,但不是全对。当提示有更精密的条件时,很多程序增加了结果序列必须与原序列长度相同。尽管也对,但这仍不够。比如,有这么个序列:
        3 1 4 1 5 9
        下面这个序列满足增序排列且与原序列有相同长度的条件:
        3 3 3 3 3 3
       尽管满足条件,但它仍然不是所要求的!这个例子来源于一个真实的产品代码中发生的错误(幸好在发布之前发现了),一个简单的按键的错位因为一个糊涂的原因诱发了一个精密的机制使整个结果填充为原数组的第一个元素。
        完整的后验条件是结果是排序了的,而是原数值的排列。这就适当地约束了所需的行为,结果的长度与输入相同也就自然出来了而无需秣。
        即便也是以这种方式阐述后验条件仍不足以给你一个好的测试。好的测试应该是可读的,应该很容易理解并且足够简单,能一眼看出正确与否。除非你已经有了检查数组排序了的而且一个序列包含另一个的排列,那么测试代码很可能比被测试的代码要更加复杂。正如Tony Hoare所说:
        有两种构建软件的方法:一种是让其尽可能简单,以至于明显没有问题;另一种是让其尽量,以至于没有明显问题。
        使用具体的盒子消除偶然的复杂度和可能性。比如,给定如下序列:
        3 1 4 1 5 9
        排序后的结果如下:
        1 1 3 4 5 9
        没有其它答案。不要接受替补。具体的例子帮助我们以可达的、明确的方式来说明一般的行为。往空的集合中添加一个元素的结果不会简单地就是集合不为空:结果是集合当前有一个元素,并且元素持有添加的元素的值。两个或者多个元素也是不为空,但这是不正确的。一个元素,但有着不同的值也不正确。往表中添加一行的结果不会简单地是表增加了一行。它需要该行的key以恢复添加的行。等等如此。
        对于特定的行为,测试不应该只是正确:它们也需要精密。

原文:Test Precisely and Concretely by Kevlin Henney

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值