@pytest.mark.parametrize 参数化总结

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 参数化总结
(煎蛋) ,节省时间代码

参数化的格式:

必须是系列表:

​ 只有一个参数时: @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 数据驱动可以这里了解

@pytest.mark.parametrize 参数化总结

实际Web UI和 Api自动化中的开发场景,比如是一个登录框
  1. 你肯定需要测试账号空、密码空、账号密码都为空、账号不存在、密码错误、账号密码正确等情况
  2. 这些用例的区别就在于输入的测试数据和对应的交互结果
  3. 所以我们可以只写一条登录测试用例,然后把多组测试数据和期望结果参数化,节省很多代码量

重点

当装饰器 @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 参数化总结

参数化,标记数据

# 标记参数化
@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

@pytest.mark.parametrize 参数化总结

上一篇:pytest文档18-配置文件pytest.ini


下一篇:Pytest系列(8) - 使用自定义标记mark