引言:
在使用自动化测试框架编写测试用例时,自动化测试人员,更多的应考虑核心的测试逻辑。
在使用unitttest的框架时,我们在测试类中,通过编写多个方法来实现,每个方法对应一个测试用例。
原则上,测试方法应包含3个部分:
第一,given 即给定测试数据部分,比如使用框架DB模块数据库中插入测试数据,或者是测试数据部分,前提是测试库中有手工测试前准备的测试数据。
第二,when部分,即当用准备的测试数据,对被测接口发送了请求,这里我归纳为测试动作部分。
第三,then部分,对接口发送请求后,断言部分,接口的实际返回和我的预期是否相符。
那么代码规范上,在使用pytest的自动化框架,总是在fixture中,尽量多写Given,在使用unittest的框架中可以写在setup方法中。
原因:
第一,增加测试的可读性和可维护性;
第二,在unittest setup中或者pytest fixture中的异常为ERROR,而不是FAIL。
所以,在编写测试函数时,我们要考虑如何使用Given部分造好的数据,或者手工测试阶段的测试数据,发送接口测试请求,以便回归自动化测试。
测试数据在函数中如何写?
在使用pytest 的自动化框架中,提供了强大的fixture,可以为测试函数传入测试数据集(少量),或者提供批量的数据源。
同样在基于unittest的自动化框架中,也提供了对数据的支持,比如paramunittest,ddt 第三方包的支持并配合excel,json , 或者yaml 文件等作为数据源。
下面通过实例来考察如何应用到框架中。
使用paramunittest
![762291d2655f4708c69c69d61f0f6aee.png](https://i-blog.csdnimg.cn/blog_migrate/d39b478492c2d160e2bb6fc41789e2cd.jpeg)
每个元组对应一个测试用例数据部分,见上图中的2,也可以在元组中,使用字典,如上图中3。并且测试类需要提供 setParameters方法,把测试数据转换为实例变量即self.参数名,供每个测试用例使用。
但是缺点也很明显,类中的每个测试函数,都要执行一遍setParameters方法,在pycharm中无法直接调试,需要指定main或者使用unittest,discover以套件方式运行
![d48a12df85e4c4cd2071ea680d93fba6.png](https://i-blog.csdnimg.cn/blog_migrate/a5bd3637ae877b5d5aa6b9dc9187bf18.jpeg)
在实际使用中,通常配合excel测试数据源使用, 并使用比如openpyxl模块或者xlrd模块将测试数据转换为列表字典格式或嵌套列表使用:
下图将测试数据写入excel中
![1486b355951cee4eb2011c944a60b0dd.png](https://i-blog.csdnimg.cn/blog_migrate/5785711119f4252a573f07e404291468.jpeg)
![11d6c7bf585ecb4d9e71a3b6fa6b2b5d.png](https://i-blog.csdnimg.cn/blog_migrate/801c2c12b860187e3ab2502f024ea613.jpeg)
使用DDT
ddt 包含一个类装饰器,@ddt 下图中1, 以及2个方法级别的装饰器@data下图中2和@unpack下图中3,它们可以应用于多个测试用例方法。
相比paramsunittest更灵活,不同的测试用例可以应用不同的测试数据。共同点是都需要有相同的测试逻辑,以解决重复写test方法,或者针对多组数据的测试。
如下图
![ce28717c7be9c9b70065bd5ae2eb4957.png](https://i-blog.csdnimg.cn/blog_migrate/9dfb79ddd87ea8915f7f35836539d11c.jpeg)
同样@data的测试数据源,可以来至json 文件
![a59560e887fa40457aa196a225e588a2.png](https://i-blog.csdnimg.cn/blog_migrate/561de2690a9d7e10037a9539b7a29042.jpeg)
![e7c7de756f8f85663df7568faba2dd64.png](https://i-blog.csdnimg.cn/blog_migrate/0eb53dc930b4369613d66f5df897afdd.jpeg)
或者使用@file_data指定json文件
![959fa6b52e10bb4a78c200b56d452e68.png](https://i-blog.csdnimg.cn/blog_migrate/90fc2735dfd8608fced3c6eb6b71a403.jpeg)
数据格式为json对象格式,{}对象中包含多个测试用例,key可为自定义测试用例名称。
![9a14da58080df5e290c3b19e41550341.png](https://i-blog.csdnimg.cn/blog_migrate/94e5b6b0e68fb04dea2c37c84a8389e7.jpeg)
优点:通过suite套件方式运行自定义,可显示json 文件中指定的key作为测试报告,用例名。
如下图
![2c78b8d8c93a16158ffa1294fd2ed659.png](https://i-blog.csdnimg.cn/blog_migrate/115f6115a3f876a5ec7aefa0e500bdb9.jpeg)
同样的,ddt也可用于excel数据驱动,方式如下
![41a1846180c81279fb7b11be33855932.png](https://i-blog.csdnimg.cn/blog_migrate/d951b8fd85d6431537e06987ba539c95.jpeg)
![60c1a69c784be8dc1b52386f9a7af724.png](https://i-blog.csdnimg.cn/blog_migrate/1ebae983c56df99ad338fc26bcdd4845.jpeg)
在excel中接口数据部分,为字典串,可以使用eval函数进行转换。
使用yaml
Yaml文件也可以作为自动化测试框架,测试数据源,特别适合用来表达或编辑数据结构、各种配置文件,特点是对格式有严格要求,使用缩进,使用 - 代表yaml 数组。
如下图:
![61106e3d4fc5fcd303679e7fe6c941cf.png](https://i-blog.csdnimg.cn/blog_migrate/2f1df46a01c7bf22896fb4cb9dcbf3af.jpeg)
框架实现中,就需要包含解析yaml 文件的模块。
代码示例:
![a9facbb0e8477b840a16fce466f5d293.png](https://i-blog.csdnimg.cn/blog_migrate/d9237ad16287eb36b173bbda885a580d.jpeg)
类似于excel 数据驱动,数据格式也需要被框架转换为字典格式,便于读取数据,数据为了便于使用,可进一步封装为对象。
![4fa8ff1caf0a19bd4b39a8809b49b89c.png](https://i-blog.csdnimg.cn/blog_migrate/d903eb25f3832a84affdb1460b93a2ca.jpeg)
然后在testCase类中,导入模块比如Dbshop_Info 类使用封装的测试数据。
最后
以上总结了Unittest 中框架使用数据驱动测试的各种方法,以及使用的好用的处理方法,另外不乏一些其他自动化框架,使用数据库作为测试数据源,亦或者使用excel,更进一步使用,写入所有测试用例,但缺乏灵活性,用例组织容易出错,尤其是对关联用例的处理。
此外,unittest框架被广泛应用于接口自动化测试框架,或者单元测试,比如Django内置基于unittest的单元测试。Pytest的fixture更强大,但非python语言内置,但无论哪种,其思想都相同。