基于属性的测试之浅显易懂

假设你知道通常的单元测试,可能你就会听说过common test。有另一种方法来检查你的系统,不同于普通的测试方法。它被称为基于属性的测试。

要做测试,应该定义输入数据的类型和范围,系统将在此基础上进行测试。输入数据的定义看起来像一个具有类型和范围参数描述的元组。它们是数据,而你在测试前生成这些数据。

然后,测试引擎将用定义的输入数据的随机组合来调用你的代码。测试引擎尝试观察被测系统是否仍然展示所定义的属性。

如果在某一时刻没有观察到所需的属性,测试将停止并且引擎将尝试缩小输入。这是试图找到仍然使得测试失败的最简单的输入数据。测试引擎将尽量减少尽可能多的参数的复杂性。

请参阅:
提供了基于属性测试功能的库有:PropErQuviq QuickCheck (商用的) (注意:QuickCheck 也有其他语言的版本!)

例子

假设你的老板要你写一个fizz_buzz函数。它的需求非常明确,fizz_buzz的入参是1到100之间的整数。另外,入参被3整除,它返回fizz,入参被5整除,它返回buzz,入参被3和5都整除,它返回fizbuzz。

所以输入范围是:1到100之间的整数。

而且我们想要观察的三个属性是:

  1. 当X rem 15 =:= 0 ,我们想看到返回值是fizzbuzz。
  2. 当X rem 3 =:= 0,我们想看到返回值是fizz。
  3. 当X rem 5 =:= 0,我们想看到返回值是buzz。

注意:
请查阅所选测试库的实际文档。库调用的语法不同。

测试引擎将尝试从定义的输入范围随机组合的值。测试引擎将确保在运行过程中观察到所有3个属性。

注意:
你可以用这种方式测试任何黑盒系统,而不需要知道它的内部情况。所测试的系统可以是C程序,甚至是真正的硬件!
它也可以运行并行测试(确保当并行发生时,并行系统不发生故障)和状态机测试(确保状态机在随机的输入下不会有问题)。

 

原文链接: http://beam-wisdoms.clau.se/en/latest/eli5-property-based.html