Python基础之pytest参数化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python基础之pytest参数化相关的知识,希望对你有一定的参考价值。

参考技术A pytest是目前比较成熟功能齐全的测试框架,使用率肯定也不断攀升。在实际

工作中,许多测试用例都是类似的重复,一个个写最后代码会显得很冗余。这里,我们来了解一下

@pytest.mark.parametrize装饰器,可以很好的解决上述问题。

释义:参数名称

格式:字符串"arg1,arg2,arg3"

释义:参数值列表

格式:必须是列表,如[val1,val2,val3]

单个参数,里面是值的列表,如@pytest.mark.parametrize("name",["Jack","Locus","Bill"])

多个参数,需要用元祖来存放值,一个元祖对应一组参数的值,如@pytest.mark.parametrize("user,age",[("user1",15),("user2",24),("user3",25)])

释义:可以理解为用例的id

格式:字符串列表,如["case1","case2","case3"]

释义:当indirect=True时,若传入的argnames是fixture函数名,此时fixture函数名将成为一个可执行的函数,

argvalues作为fixture的参数,执行fixture函数,最终结果再存入 request.param;当indirect=False时,fixture

函数只作为一个参数名给测试收集阶段调用。

备注:这里可以将the setup phase(测试设置阶段)理解为配置 conftest.py 阶段,将the collection phase(

测试收集阶段)理解为用例执行阶段。

由以上代码可以看到,当装饰器装饰测试类时,定义的数据集合会被传递给类的所有方法。

当测试用例只需要一个参数时,我们存放数据的列表无序嵌套序列,@pytest.mark.parametrize("name", data)

装饰器的第一个参数也只需要一个变量接收列表中的每个元素,第二个参数传递存储数据的列表,那么测试用

例需要使用同名的字符串接收测试数据(实例中的name)且列表有多少个元素就会生成并执行多少个测试用例。

当测试用例需要多个数据时,我们可以使用嵌套序列(嵌套元组&嵌套列表)的列表来存放测试数据。

装饰器@pytest.mark.parametrize()可以使用单个变量接收数据,也可以使用多个变量接收,同样,测

试用例函数也需要与其保持一致。

当使用单个变量接收时,测试数据传递到测试函数内部时为列表中的每一个元素或者小列表,需

要使用索引的方式取得每个数据。

当使用多个变量接收数据时,那么每个变量分别接收小列表或元组中的每个元素列表嵌套多少个多

组小列表或元组,测生成多少条测试用例。

通过测试结果,我们不难分析,一个测试函数还可以同时被多个参数化装饰器装饰,那么多个

装饰器中的数据会进行交叉组合的方式传递给测试函数,进而生成n * n个测试用例。

输出结果显示收集到4个用例,两个通过,一个被跳过,一个标记失败,当我们不想执行某组测试

数据时,我们可以标记skip或skipif;当我们预期某组数据会执行失败时,我们可以标记为xfail等。

参数化装饰器有一个额外的参数ids,可以标识每一个测试用例,自定义测试数据结果的显示,

为了增加可读性,我们可以标记每一个测试用例使用的测试数据是什么,适当的增加一些说明。

在使用前你需要知道,ids参数应该是一个字符串列表,必须和数据对象列表的长度保持一致。

不加ids参数的返回结果

加ids参数的返回结果

我们可以看到带ids参数的返回结果中的用例都被一个列表明确的标记了,而且通过这种标记

可以更加直观的看出来,每个测试用例使用的数据名称及测试内容。

以上是关于Python基础之pytest参数化的主要内容,如果未能解决你的问题,请参考以下文章

python-pytest学习-参数化

Web 自动化测试全面提升之 Pytest

python 模拟pytest参数化测试

python+appium+pytest自动化测试-参数化设置建议收藏

Python的hook函数(pytest_generate_tests())进行测试的参数化

python 参数化pytest测试用例,包含参数字典和人类可读的测试用例名称