前言 unittest单元测试框架使用DDT进行数据驱动测试,那么身为功能更加强大且更加灵活的Pytest框架怎么可能没有数据驱动的概念呢?其实Pytest是使用@pytest.mark.parametrize装饰器来实现数据驱动测试的,那么今天我们就简单来说说在它是如何进行数据驱动测试的
装饰测试类   当装饰器装饰测试类时,给数据集合会被传递给给类的所有方法
装饰测试函数   当测试用例只需要一个参数时,我们存放数据的列表无序嵌套序列,@pytest.mark.parametrize(‘a’, data)装饰器的第一个参数也只需要一个变量接收列表中的每个元素,第二个参数传递存储数据的列表,那么测试用例需要使用同名的字符串接收测试数据(实例中的a)且列表有多少个元素就会生成并执行多少个测试用例   当测试用例需要多个数据时,我们可以使用嵌套序列(嵌套元组&嵌套列表)的列表来存放测试数据
装饰器@pytest.mark.parametrize()可以使用单个变量接收数据,也可以使用多个变量接收,同样,测试用例函数也需要与其保持一致
当使用单个变量接收时,测试数据传递到测试函数内部时为列表中的每一个元素或者小列表,需要使用索引的方式取得每个数据
当使用多个变量接收数据时,那么每个变量分别接收小列表或元组中的每个元素
列表嵌套多少个多组小列表或元组,测生成多少条测试用例
图解对应关系    通过测试结果,我们不难分析,一个测试函数还可以同时被多个参数化装饰器装饰,那么多个装饰器中的数据会进行交叉组合的方式传递给测试函数,进而生成n*n个测试用例,这也为我们的测试设计时提供了方便  可以直接标记测试用例,参数化装饰器也可以识别(标记用例失败或跳过)
标记为无条件跳过(标记为失败为xfail,自己尝试)   输出结果显示收集到2个用例,一个通过,一个被跳过,当我们不想执行某组测试数据时,我们可以标记skip或skipif;当我们预期某组数据会执行失败时,我们可以标记为xfail等   增加可读性  参数化装饰器有一个额外的参数ids,可以标识每一个测试用例,自定义测试数据结果的显示,为了增加可读性,我们可以标记每一个测试用例使用的测试数据是什么,适当的增加一些说明
在使用前你需要知道,ids参数应该是一个字符串列表,必须和数据对象列表的长度保持一致,我们可以试着使用ids,看下效果  装饰器不传递ids参数的输出  装饰器传递ids参数的输出  执行命令我使用了-v,会更加详细的显示输出结果,可以看到所有的数据结果中的用例都被一个列表明确的标记了,而且通过这种标记可以更加直观的看出来,每个测试用例使用的数据名称及测试内容  除了使用ids参数增加输出可读性外,我们还可以在参数列表的参数旁边定义一个id值来做标识,看下面实例   如果使用此方法来标记测试用例,一定要严格按照我写的格式来使用,语法为pytest.param(value, id=‘somthing’)
总结 Pytest中实现数据驱动就是如此了
掌握
1.装饰器与测试用例使用单个变量接收多组数据与多个变量接收多个数据的访问方法
2.不同测试数据形式(列表嵌套元组,列表,字典等)时,如何传递数据及访问数据
3.装饰器装饰测试类和测试函数的不同之处:装饰测试类时,类内所有的方法必须接送测试数据,否则会报错,装饰测试函数时比较灵活,如果函数不使用数据就可以不装饰
4.为了输出结果的可读性,可以选择使用ids参数,与测试数据中定义id参数值来标识测试用例
注意
-
装饰器的第一个参数是一个列表形式的字符串参数"a, b, c" 不能写成"a", “b”, “c” -
ids是个字符串列表,它的长度需要与测试数据列表的长度一致
免费海量学习资料+面试资料+测试学习视频加群:646294456
|