pytest.mark.parametrize 参数化
pytest允许在多个级别启用测试参数化:
- pytest.fixture() 允许fixture有参数化功能(后面讲解)
- @pytest.mark.parametrize 允许在测试函数或类中定义多组参数和fixtures
- pytest_generate_tests 允许定义自定义参数化方案或扩展(拓展)
知识储备尚浅,目前知道的不多
参数化场景
只有测试数据和期望数据不一致,但是操作步骤是一样的测试用例可以用参数化
上代码实战:
import pytest
# def test_case01():
# assert 1+1 == 2
#
# def test_case02():
# assert 2+3 == 6
#
# def test_case03():
# assert 8+7 == 20
@pytest.mark.parametrize('inbody,expdata',[('1+1',2),('2+3',6),('8+7',20)])
def test_case04(inbody,expdata):
assert eval(inbody) == expdata
可以看到注释的代码 写的太冗余 鸡肋 ,而参数化
(煎蛋) ,节省时间代码
参数化的格式:
必须是系列表:
只有一个参数时: @pytest.mark.parametrize("inbody", ["xx", "xx1", "xx2"])
多个参数时:@pytest.mark.parametrize("inbody,inbody1", [("xx", "123"), ("xx1", "123"), ("xx2", "123")])
备注:虽然源码说需要list包含tuple,但我试了下,tuple包含list,list包含list也是可以的........
https://www.cnblogs.com/blog-123/p/14590493.html 数据驱动可以这里了解
实际Web UI和 Api自动化中的开发场景,比如是一个登录框
- 你肯定需要测试账号空、密码空、账号密码都为空、账号不存在、密码错误、账号密码正确等情况
- 这些用例的区别就在于输入的测试数据和对应的交互结果
- 所以我们可以只写一条登录测试用例,然后把多组测试数据和期望结果参数化,节省很多代码量
重点
当装饰器 @pytest.mark.parametrize 装饰测试类时,会将数据集合传递给类的所有测试用例方法
# 笛卡尔积,组合数据
data_1 = [1, 2, 3]
data_2 = ['a', 'b']
@pytest.mark.parametrize('a', data_1)
@pytest.mark.parametrize('b', data_2)
def test_parametrize_1(a, b):
print(f'笛卡尔积 测试数据为 : {a},{b}')
参数化,标记数据
# 标记参数化
@pytest.mark.parametrize('inbody,expdata',[('1+1',2),('3+4',8),('6+6',13),
pytest.param('4+4',9,marks=pytest.mark.xfail),
pytest.param('6*6',67,marks=pytest.mark.xfail)])
def test_mark(inbody,expdata):
assert eval(inbody) == expdata