pytest参数化接口测试,pytest指定用例
1.pytest实现测试用例的参数化(@ pytest . mark . parameter ize)@ pytest . mark . parameter ize Decorator可以实现测试用例的参数化,方便测试数据的获取。
@ pytest.mark. parametrize的基本用法:方便测试函数获取测试数据。
方法:
参数rize (argnames,argvalues,indirect=false,ids=none,scope=none)参数说明:
参数化用法1。单参数[测试方法只有一个参数] #文件名:test _ parametrize.py
导入pytest
类测试_D:
@ py test . mark . Parameter ize( A ,[1,2,3]) #参数A被赋予3个值,test_a将运行3次。
Test _ a (self,a): # parameter必须与parametrize中的参数一致。
print(\n - test_a已经运行,a={} 。格式(a))
断言1==a
if __name__==__main__ :
Test.main ([-s , test _ parameter ize . py ])运行结果:
从运行结果可以看出,test_a方法已经执行了三次,说明参数A的参数化是成功的。
2.多个参数[测试方法中有多个参数]# file _ name:test _ parameter ize . py
导入pytest
类测试_D:
@ pytest . mark . parameterize( A,B ,[(1,2),(2,3),(3,4)]) #参数A和B给三个值,函数会运行三次。
Test _ b (self,a,b): # parameter必须与parametrize中的参数一致。
print(\n - test_b已经运行,并且a={},b={} 。格式(a,b))
断言1
if __name__==__main__ :
Test.main ([-s , test _ parameter ize . py ])运行结果:
从运行结果可以看出,test_b方法执行了三次,说明参数A和B已经参数化了。
3.使用函数的返回值来参数化用例# file _ name:test _ parameter ize . py。
导入pytest
#定义一个返回参数值的函数
def返回测试数据():
return [(1,2),(2,3),(3,4)]
类测试_D:
@ pytest . mark . parameter ize( a,b ,return _ test _ data ()) #使用函数的返回值传入参数值。
def test_c(self,a,b):
print(\n - test_c已经运行,并且a={},b={} 。格式(a,b))
断言1
if __name__==__main__ :
Test.main ([-s , test _ parameter ize . py ])运行结果:
从运行结果来看,test_c方法执行了三次,说明函数的返回值也可以参数化。
4.参数组合获得多个参数的所有组合,可以堆叠使用参数装饰器:【每个参数装饰器代表参数测试方法中的一组测试数据】
#文件名:测试参数化. py
导入pytest
类测试_D:
@ pytest . mark . parameter ize( x ,[1,2])
@ pytest . mark . parameter ize( y ,[3,4])
def test_d(self,x,y):
print(\n - test_d已经运行,x={},y={} 。格式(x,y))
if __name__==__main__ :
Test.main ([-s , test _ parameter ize . py ])运行结果:
从运行结果可以看出,test_d方法已经执行了四次。这是因为参数x和参数y分别被赋予了两个值,组合是2*2=4次,也就是说所有参数的组合都可以通过decorators的叠加得到。
其次,在@ pytest . mark . parameter ize decorator中参数化间接参数。间接参数一般结合pytest中fixture函数的请求。
当indrect=True时,argnames会传入fixture函数的名称,不再是普通的参数,而是要调用的fixture函数,argvalues是要传递给这个fixture函数的值。
用法其实和@pytest.fixture(params)一样,但是@ py test . mark . parameter ize的使用相当于将fixture函数参数化,而不仅仅是一组固定的数据被传入使用。
例1:【由于参数化decorator的参数indirect=Ture,pytest测试框架将login_r作为函数执行,并将test_user_data列表作为参数传入login_r函数】导入pytest。
测试用户数据=[汤姆,杰里]
#方法名作为参数
@pytest.fixture(scope=module )
定义登录请求:
User=request.param #通过request.param获取测试参数。
Print(f 登录用户:{user} )
返回用户
@ py test . mark . parameterize( log in _ r ,test_user_data,indirect=True)
def test_login(login_r):
a=登录_r
打印(f 测试用例中login_r函数的返回值;{a} )
断言a!= 运行结果:
实例2:单固定装置单值(通过列表)导入pytest
@pytest.fixture()
定义登录(请求):
user=request.param
打印(传入的用户名为:{}.格式(用户))
返回用户
用户=[张三, 李四]
@ pytest。马克。参数ize( log in ,user,indirect=True) #此时测试函数参数化的值为登录设备函数的返回值(参数列表用户中存在几组数据就进行了几次参数化)
定义测试参数(登录):
打印(测试函数的读到的用户是:{}.格式(登录))运行结果:
详细解释:
整个调用过程如下:
实例3:单固定装置多值(通过字典)导入pytest
user_info=[
{ 用户: 张三, pwd: 123},
{ 用户: 李四, pwd: 456}
]
@pytest.fixture()
定义登录(请求):
user=request.param
打印(传入的用户名为:{},密码为:{}.格式(用户[用户],用户[密码]))
返回用户
@ pytest。马克。参数化(登录,user_info,indirect=True)
定义测试参数(登录):
打印(测试类的读到的用户是:{} 密码是:{}.格式(登录[用户],登录[密码]))运行结果:
实例4:传多固定装置多值(通过嵌套元组的列表)导入pytest
# 一个@ pytest。马克。参数ize使用多个夹具,传入的数据要是嵌套了元组的列表
user_info=[
(张三, 123),
(李四, pwd )
]
@pytest.fixture()
定义登录用户(请求):
user=request.param
打印(传入的用户名为:{}.格式(用户))
返回用户
@pytest.fixture()
定义登录_密码(请求):
pwd=request.param
打印(密码为:{}.格式(pwd))
返回密码
@ pytest。马克。参数化( log in _ user,login_pwd ,user_info,indirect=True)
定义测试参数(登录用户,登录密码):
打印(测试类的读到的用户是:{} 密码是:{}.格式(登录用户,登录密码)运行结果:
实例5:叠加夹具(单值列表,执行次数笛卡尔集N*M)导入pytest
用户=[张三, 李四]
密码=[124345]
@pytest.fixture()
定义登录用户(请求):
user=request.param
打印(传入的用户名为:{}.格式(用户))
返回用户
@pytest.fixture()
定义登录_密码(请求):
pwd=request.param
打印(密码为:{}.格式(pwd))
返回密码
@ pytest。马克。参数化( log in _ pwd ,pwd,indirect=True)
@ pytest。马克。参数化( log in _ user ,user,indirect=True)
定义测试参数(登录用户,登录密码):
打印(测试类的读到的用户是:{} 密码是:{}.格式(登录用户,登录密码)运行结果:
三、参数化@ pytest。马克。参数ize装饰器中的范围参数使用范围参数的作用范围取值与固定装置函数的范围一致,且你好有当间接=真才会被使用。
范围参数的作用范围会覆盖固定装置函数的范围范围,如果同一个被调用的固定装置函数有多个用参数表示定义了范围,取第一条的范围。
实例:导入pytest
@pytest.fixture(scope=class )
定义登录用户(请求):
user=request.param
打印(传入的用户名为:{}.格式(用户))
返回用户
@pytest.fixture(scope=class )
定义登录_密码(请求):
pwd=request.param
打印(密码为:{}.格式(pwd))
返回密码
类测试用例:
userinfo=[
(张三, 123)
]
ids=[case{} .范围内我的格式(I)(len(userinfo))]
@ pytest。马克。参数化( log in _ user,login_pwd ,userinfo,ids=ids,indirect=True,scope=function )
def test_one_param(self,login_user,login_pwd):
打印(测试类的读到的内容是{}{}.格式(登录用户,登录密码)
@ pytest。马克。参数化( log in _ user,login_pwd ,userinfo,ids=ids,indirect=True,scope=function )
def test_one_param2(self,login_user,login_pwd):
打印(测试类的读到的内容是{}{}.格式(登录用户,登录密码)运行结果:
小于固定装置函数的范围范围:
大于固定装置函数的范围范围:
多个范围范围为先执行的:
与相比调整一下顺序:
四、参数化@ pytest。马克。参数ize加标记标记跳过执行其中一组或者多组测试数据(标记同一的测试方法中的子用例,并在子用例上做标记操作:xfail,跳过等等)需求:pytest使用@ pytest。马克。参数ize对测试用例进行参数化的时候,当存在多组测试数据时,需要对其中的一组或者多组测试数据加标记跳过执行,可以用pytest.param实现。
pytest.param用法:参数:参数值:按顺序传参数集值的变量一个参数名
关键词标记:标记关键字参数,要应用于此参数集的单个标记或标记列表。
关键字串id: id字符串关键字参数,测试用例的编号属性【测试用例名】
源码:定义参数(*值,* *千瓦):
在pytest。马克。参数ize `_调用中指定一个参数,或者
:参考:` 1参数化夹具夹具-参数化-标记`。
.代码块* python
@ pytest。马克。参数ize( test _ input,应为,[
(3 5, 8),
pytest.param(6*9 ,42,marks=pytest.mark.xfail),
])
def test_eval(测试输入,应为):
断言eval(test_input)==应为
:参数值:参数集值的变量参数,按顺序排列。
:关键字标记:要应用于该参数集的单个标记或标记列表。
:关键字字符串id:属于该参数集的身份证.
返回参数集。param(*值,* *千瓦)实例1:xfail标记同一测试方法的子用例导入pytest
@ pytest。马克。参数ize( test _ input,应为,[
(3 5, 8),
pytest.param(6*9 ,42,marks=pytest.mark.xfail),
])
def test_eval(测试输入,应为):
断言eval(test_input)==应为运行结果:
实例2:跳过标记同一测试方法的子用例导入pytest
@ pytest。马克。参数ize( user,psw ,
[(学生, 123456 ),
(老师, abcdefg ),
pytest.param(admin ,我爱中华!,marks=pytest.mark.skip(reason=跳过原因))
])
定义测试登录(用户,psw):
打印(用户): psw
断言1==1运行结果:
实例3:类比实例2与实例3子用例参数化的区别导入pytest
@ pytest。马克。参数ize(数字,
[pytest.param(1 ),
pytest.param(2 ),
pytest.param(3 ,marks=pytest.mark.skip(reason=该参数未准备好))])
def test_login1(数字):
打印(数字)
断言1==1运行结果:
实例4:导入pytest
@ pytest。马克。参数ize( user,psw ,
[pytest.param(admin1 , 123456 ),
pytest.param(admin2 , abcdefg ),
pytest.param(admin3 , higklmn ,marks=pytest.mark.skip(此用户的登录信息还没有初始化,不可使用))])
def test_login1(用户,psw):
打印(用户): psw
断言1==1运行结果:
五、参数化@ pytest。马克。参数ize装饰器中的编号参数与本能冲动参数使用编号参数需要参照本能冲动参数并加以区分:pytest参数化自定义测试用例标题【@ py测试。马克。参数ize(ids=XXX)】id参数是给用例添加标题内容,没加编号参数的时候,用例会默认拿请求的参数当用例标题;如实例一
id参数是指单条参数化测试用例数据时,分别为同一测试方法中的每一条测试用例进行命名;本能冲动参数是指多条参数化测试用例数据时,id参数传入一个列表或者元组,分别为同一测试方法中的所有测试用例进行命名。如实例2、实例3
实例1:导入pytest
@ pytest。马克。参数ize( user,psw ,
[pytest.param(admin1 , abcdefg ),
pytest.param(admin2 , 123456 ),
pytest.param(admin3 , qwerty ,marks=pytest.mark.skip)])
def test_login1(用户,psw):
打印(用户): psw
断言1==1运行结果:
实例2:导入pytest
@ pytest。马克。参数ize( user,psw ,
[pytest.param(admin1 , abcdefg ,id=第一条测试用例名字),
pytest.param(admin2 , 123456 ,id=第二条测试用例名字),
pytest.param(admin3 , qwerty ,marks=pytest.mark.skip,id=第三条测试用例名字)])
def test_login1(用户,psw):
打印(用户): psw
断言1==1运行结果:
实例3:导入pytest
@ pytest . mark . parameterize( user,psw ,argvalues=[(admin1 , abcdefg ),( admin2 , 123456 ),( admin3 , qwerty)],
Ids=[第一个测试用例名称,第二个测试用例名称,第三个测试用例名称])
def test_login1(用户,psw):
打印(用户): psw
断言1==1运行结果:
期待陌生,拥抱惊喜。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。