用Python为接口自动生成测试用例

基于属性的测试会产生大量的、随机的参数,特别适合为单元测试和接口测试生成测试用例

尽管早在2006年haskell语言就有了QuickCheck来进行”基于属性的测试“,但是目前来看这依然是一个比较小众的领域,参考资料有限,本文如有不足,欢迎指正。


1. 基于表的测试

在过去的测试实践中,执行测试时通常需要明确的内容(Value):

  1. 条件
  2. 输入
  3. 结果

这些内容可以通过”判定树“或者”判断表“来表示,然后测试的执行过程变成了这样

“给定输入 X,我们期望 Y”

可以称为 基于表的测试

在最初,这给了我们测试的方向,但是缺点也非常明显:

你要足够多的"X->Y" 才能可能覆盖到隐蔽的bug。

这里请大家回答几个问题:

  1. 你是否已经为每一个测试编写了足够多的用例,以至于你十分确定真的不需要再增加用例了
  2. 这么多的用例,你编写的是否开心?是否高效?是否愿意继续坚持?

如果以上问题的答案不是yes,那么基于属性的测试就是你需要掌握的东西!


2. 基于属性的测试

基于属性的测试和基于表的测试,最大的区别可以这样描述:

“给定输入 X值,我们期望 Y值”

vs

“给定输入 X类,我们期望 Y类”

于是利用工具生成大量的X类数据,进行测试,并验证结果是否Y类。

值得注意的是:

  1. 关注输入的类型,而不是输入的值
  2. 根据类型自动生成大量的、随机的输入值

换言之,它在自动的生成测试用例,虽然输入值是随机的,但是值得类型符合规范要求


3. 如何进行基于属性的测试

在不同的语言中有不同的工具来实现,比如:

  • haskell中的QuickCheck
  • java中的quicktheories
  • python中的hypothesis

本文以python为例进行演示:

假设有add函数,接收两个类型整数参数,并返回它们的相加结果

def add(a: int, b: int) -> int: pass

首先写出一个简单的测试用例

def test_add(): assert 3 == add(1, 2)

正如前面所说,一个这样的用例,根本没信心覆盖全部的场景,例如:

  • 参数是0
  • 参数是负数
  • 参数值特别大
  • 其他...

所以接下来怎么办?

改为基于属性的测试

import hypothesis.strategies as st from hypothesis import given @given(st.integers(), st.integers()) def test_add(a, b): c = add(a, b) print(f"{a=},{b=}, {c=}") assert isinstance(c, int) assert c == a + b

执行结果

a=0,b=0, c=0 a=0,b=0, c=0 a=0,b=0, c=0 a=16926,b=11053, c=27979 a=0,b=0, c=0 a=0,b=0, c=0 a=21010,b=-2732672789497425072, c=-2732672789497404062 a=0,b=0, c=0 a=14554,b=-15956, c=-1402 a=15597,b=0, c=15597 a=15597,b=13, c=15610 a=15597,b=0, c=15597 a=15597,b=15597, c=31194 a=28965,b=-36, c=28929 a=113,b=-36, c=77 a=28929,b=-36, c=28893 a=28929,b=9356, c=38285 a=9356,b=9356, c=18712 a=10278,b=-62, c=10216 a=-62,b=-62, c=-124 a=1625,b=-68244995710046113596363052355575247332, c=-68244995710046113596363052355575245707 a=1625,b=-13143, c=-11518 a=1625,b=1625, c=3250 a=-1940,b=-31868, c=-33808 a=-7,b=1, c=-6 a=-1,b=0, c=-1 a=-1,b=0, c=-1 a=13,b=7245, c=7258 a=13,b=13, c=26 a=-99,b=-18, c=-117 a=-30172,b=66, c=-30106 a=-30172,b=-16940, c=-47112 a=-16940,b=-16940, c=-33880 a=-1233214851,b=-5152, c=-1233220003 a=-5152,b=-5152, c=-10304 a=-16,b=-29706, c=-29722 a=-29706,b=-29706, c=-59412 a=-29706,b=116, c=-29590 a=29696,b=90, c=29786 a=29696,b=29696, c=59392 a=-11446,b=-21185, c=-32631 a=-21185,b=-21185, c=-42370 a=-12,b=16437, c=16425 a=-12,b=16437, c=16425 a=3202,b=53, c=3255 a=3202,b=3202, c=6404 a=-98,b=3, c=-95 a=82691970030325711417874227410289695610,b=1316378701, c=82691970030325711417874227411606074311 a=82691970030325711417874227410289695610,b=82691970030325711417874227410289695610, c=165383940060651422835748454820579391220 a=24100,b=14385, c=38485 a=24100,b=14385, c=38485 a=24100,b=24100, c=48200 a=12293,b=-106, c=12187 a=12293,b=27280, c=39573 a=27280,b=27280, c=54560 a=-18887,b=-5530, c=-24417 a=-18887,b=-18887, c=-37774 a=4738,b=122351151658095310625663643505383743930, c=122351151658095310625663643505383748668 a=-24601163521689169516616964879873921492,b=565838202, c=-24601163521689169516616964879308083290 a=4738,b=122351151658095310625663643281738736058, c=122351151658095310625663643281738740796 a=-96098295006598318424285019062007505,b=25207226, c=-96098295006598318424285019036800279
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章