上篇博文介绍过,pytest是目前比较成熟功能齐全的测试框架,使用率肯定也不断攀升。在实际
工作中,许多测试用例都是类似的重复,一个个写最后代码会显得很冗余。这里,我们来了解一下
@pytest.mark.parametrize装饰器,可以很好的解决上述问题。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
|
argnames
释义:参数名称
格式:字符串"arg1,arg2,arg3"
aegvalues
释义:参数值列表
格式:必须是列表,如[val1,val2,val3]
单个参数,里面是值的列表,如@pytest.mark.parametrize("name",["Jack","Locus","Bill"])
多个参数,需要用元祖来存放值,一个元祖对应一组参数的值,如@pytest.mark.parametrize("user,age",[("user1",15),("user2",24),("user3",25)])
ids
释义:可以理解为用例的id
格式:字符串列表,如["case1","case2","case3"]
indirect
释义:当indirect=True时,若传入的argnames是fixture函数名,此时fixture函数名将成为一个可执行的函数,
argvalues作为fixture的参数,执行fixture函数,最终结果再存入 request.param;当indirect=False时,fixture
函数只作为一个参数名给测试收集阶段调用。
备注:这里可以将the setup phase(测试设置阶段)理解为配置 conftest.py 阶段,将the collection phase(
测试收集阶段)理解为用例执行阶段。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
由以上代码可以看到,当装饰器装饰测试类时,定义的数据集合会被传递给类的所有方法。
1 2 3 4 5 6 7 8 9 10 11 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
当测试用例只需要一个参数时,我们存放数据的列表无序嵌套序列,@pytest.mark.parametrize("name", data)
装饰器的第一个参数也只需要一个变量接收列表中的每个元素,第二个参数传递存储数据的列表,那么测试用
例需要使用同名的字符串接收测试数据(实例中的name)且列表有多少个元素就会生成并执行多少个测试用例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
当测试用例需要多个数据时,我们可以使用嵌套序列(嵌套元组&嵌套列表)的列表来存放测试数据。
装饰器@pytest.mark.parametrize()可以使用单个变量接收数据,也可以使用多个变量接收,同样,测
试用例函数也需要与其保持一致。
当使用单个变量接收时,测试数据传递到测试函数内部时为列表中的每一个元素或者小列表,需
要使用索引的方式取得每个数据。
当使用多个变量接收数据时,那么每个变量分别接收小列表或元组中的每个元素列表嵌套多少个多
组小列表或元组,测生成多少条测试用例。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
通过测试结果,我们不难分析,一个测试函数还可以同时被多个参数化装饰器装饰,那么多个
装饰器中的数据会进行交叉组合的方式传递给测试函数,进而生成n * n个测试用例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
输出结果显示收集到4个用例,两个通过,一个被跳过,一个标记失败,当我们不想执行某组测试
数据时,我们可以标记skip或skipif;当我们预期某组数据会执行失败时,我们可以标记为xfail等。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
参数化装饰器有一个额外的参数ids,可以标识每一个测试用例,自定义测试数据结果的显示,
为了增加可读性,我们可以标记每一个测试用例使用的测试数据是什么,适当的增加一些说明。
在使用前你需要知道,ids参数应该是一个字符串列表,必须和数据对象列表的长度保持一致。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
不加ids参数的返回结果
加ids参数的返回结果
我们可以看到带ids参数的返回结果中的用例都被一个列表明确的标记了,而且通过这种标记
可以更加直观的看出来,每个测试用例使用的数据名称及测试内容。
?现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】
最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走!?希望能帮助到你!【100%无套路免费领取】