【pytest-11】装饰器parametrize参数化的用法
前言
pytest.mark.parametrize装饰器可以实现测试用例参数化。
@pytest.mark.parametrize详解
Pytest中装饰器@pytest.mark.parametrize('参数名',list)可以实现测试用例参数化,类似DDT
如:@pytest.mark.parametrize('请求方式,接口地址,传参,预期结果',[('get','www.baidu.com','{"page":1}','{"code":0,"msg":"成功"})',('post','www.baidu.com','{"page":2}','{"code":0,"msg":"成功"}')])
- 1.第一个参数是字符串,多个参数中间用逗号隔开
- 2.第二个参数是list,多组数据用元祖类型,传三个或更多参数也是这样传,list中的每一个元素都是元祖,元祖里的每个元按和参数顺序一一对应
- 3.传一个参数,@pytest.mark.parametrize('‘参数名’,list)进行参数化
- 4.传两个参数,@pytest.mark,parametrize('参数名1,参数名2',[(参数1_data[0],参数2_data[0]),(参数2_data[1],参数2_data[1])])进行参数化
示例:
1.是一个引用parametrize装饰器参数化来断言实际值和预期值的示例
#encoding:utf-8 #@Time:2020/12/3 10:16 #@Author:sunny import pytest @pytest.mark.parametrize("actual,expected", [('5+5',10), ('3+7',10), ('6*4',10)]) def test_compare(actual,expected): assert eval(actual)==expected if __name__ == '__main__': pytest.main(["-s","cnashuhua.py"])
运行结果:
Testing started at 14:21 ... ============================= test session starts ============================= collected 3 items cnasuhua.py ..F cnasuhua.py:7 (test_compare[6*4-10]) 10 != 24 Expected :24 Actual :10 <Click to see difference> actual = '6*4', expected = 10 @pytest.mark.parametrize("actual,expected", [('5+5',10), ('3+7',10), ('6*4',10)]) def test_compare(actual,expected): > assert eval(actual)==expected E AssertionError: assert 24 == 10 E + where 24 = eval('6*4') cnasuhua.py:13: AssertionError [100%] =========================== short test summary info =========================== FAILED cnasuhua.py::test_compare[6*4-10] - AssertionError: assert 24 == 10 ========================= 1 failed, 2 passed in 0.07s ========================= Process finished with exit code 0
2.它也可以标记单个用例预期失败或者成功,例如使用内置的mark.xfail
import pytest @pytest.mark.parametrize("actual,expected", [('5+5',10), (pytest.param("3+7",10,marks=pytest.mark.xfail)), (pytest.param("6*4",72,marks=pytest.mark.xfail))]) def test_compare(actual,expected): print("开始测试用例------------") assert eval(actual)==expected if __name__ == '__main__': pytest.main(["-s","cnashuhua.py"])
运行结果:
============================= test session starts ============================= collected 3 items cnasuhua.py .开始测试用例------------ X开始测试用例------------ x开始测试用例------------
=================== 1 passed, 1 xfailed, 1 xpassed in 0.08s ===================
执行(使用xfail标记的用例仍然会执行):
- xfailed 为失败的用例,小写 x
- xpassed 为通过的用例,大写 X
参数组合
1.若要获取多个参数化的所有组合,可以堆叠参数化装饰器
import pytest @pytest.mark.parametrize("x",[0,1]) @pytest.mark.parametrize("y",[2,3]) def test_zuhe(x,y): print("测试数据组合:x=%s,y=%s"%(x,y)) if __name__ == '__main__': pytest.main(['-s',"cnasuhua.py"])
运行结果:
cnasuhua.py 测试数据组合:x=0,y=2 .测试数据组合:x=1,y=2 .测试数据组合:x=0,y=3 .测试数据组合:x=1,y=3
善于跌倒仍喜爱奔跑~