基于属性的测试 会产生大量的、随机的参数,特别适合为单元测试和接口测试生成测试用例
尽管早在2006年haskell语言就有了 QuickCheck 来进行”基于属性的测试“,但是目前来看这依然是一个比较小众的领域,参考资料有限,本文如有不足,欢迎指正。
在过去的测试实践中,执行测试时通常需要明确的内容(Value):
这些内容可以通过”判定树“或者”判断表“来表示,然后测试的执行过程变成了这样
可以称为 基于表的测试
在最初,这给了我们测试的方向,但是缺点也非常明显:
你要足够多的"X->Y" 才能可能覆盖到隐蔽的bug。
这里请大家回答几个问题:
如果以上问题的答案不是yes,那么 基于属性的测试 就是你需要掌握的东西!
基于属性的测试和基于表的测试,最大的区别可以这样描述:
vs
于是利用工具生成大量的X类数据,进行测试,并验证结果是否Y类。
值得注意的是:
在不同的语言中有不同的工具来实现,比如:
本文以python为例进行演示:
假设有add函数,接收两个类型整数参数,并返回它们的相加结果
首先写出一个简单的测试用例
正如前面所说,一个这样的用例,根本没信心覆盖全部的场景,例如:
所以接下来怎么办?
改为基于属性的测试
执行结果
由结果可知,工具根据 参数是整数 这一规范,自动生成、执行了大量的测试用例
接口测试和函数的单元测试非常相似:
此外接口文档作为前后端、甚至测试开发的对接窗口,对参数的要求约定的更加细致,
以OpenAPI为例,每个参数可以有以下属性:
于是为接口生成符合要求的参数就变得可行了,举个例子:
这是以unittest为例进行封装的结果,只需要在TestCase中指定openapi的内容(或路径),
启动测试框架时,会自动读取、解析接口文档,并生成测试用例
下面是部分执行日志,可以看到对接口发送了随机参数,并获得返回值
文章来自https://www.cnblogs.com/dongfangtianyu/p/api_test_by_pbt.html
1、单独添加一个或多个用例
......
2、添加某个类下的所有用例
2.1方法一:
如Class_name类下有多个用例,则直接括号里不写入任何用例名,即可测试该类下所有用例。
2.2方法二
使用unittest.makeSuite(类名),将该类下所有用例添加到套件中
2.3方法三
使用 unittest.TestLoader()这个类下的loadTestsFromTestCase(类名),将该类下的所有用例加入到套件中
3、将整个文件中的用例都加载到套件中,不管有几个用例类
使用 unittest.TestLoader()这个类下的loadTestsFromModule(文件名, pattern=None),moudle就是用例存放的文件名
Pytest是一个比PyUnit更加复杂的测试框架,其将测试常用的内容都包含进来了,如生成测试报告、生成覆盖率报告等。而且Pytest提供插件功能,很多开发人员可以通过开发Pytest插件来扩展Pytest的功能。
Pytest也不是Python自带的模块,需要自行安装。推荐使用PIP进行安装,安装命令如下:
安装完成后就可以在系统的安装目录看到pytest和py.test两个文件。这两个文件只是文件名不同,内容是一样的,它们都是Python脚本文件。
pip install pytest
1、测试用例
有两种定义测试用例的方法,第一种方法是定义一个以test_开头的函数,这样的函数默认都会被认为是测试用例。
第二种方法是定义一个以Test开头的类,该类中所有以test开头的函数都被认为是一个测试用例。
2、选择执行的测试用例
可以像以前一样,通过指定模块名来运行测试用例。假定当前目录下有两个文件,test_a.py和test_b.py,分别包含一些测试用例。test_a.py的内容如下:
test_b.py的内容如下:
如果希望执行test_a.py中的两个测试用例,可以使用下面的命令:
如果希望执行test_a.py和test_b.py中的所有测试用例,可以使用下面的命令:
如果希望仅执行test_a.py中的test_case_a_1测试用例,可以使用下面的命令:
如果希望执行test_a.py中的test_case_a_1和test_b.py中的test_case_b_2这两个测试用例,可以使用下面的命令:
如果对于所选中的测试用例不是特别有把握,可以使用参数--setup-plan,这样测试用例不会真正执行,只是列出计划执行的测试用例列表。
需要注意的是,测试用例文件的名字推荐以test_开头,或者以_test结尾;不同目录下不能有相同的文件。