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

Python011

用 Python 为接口测试自动生成用例,第1张

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

尽管早在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结尾;不同目录下不能有相同的文件。