美文网首页pytest
Pytest学习9 -参数化@pytest.mark.param

Pytest学习9 -参数化@pytest.mark.param

作者: C1R2 | 来源:发表于2020-11-17 22:13 被阅读0次
前言

pytest允许在多个级别启用测试参数化:

pytest.fixture() 允许fixture有参数化功能(后面讲解)
@pytest.mark.parametrize 允许在测试函数或类中定义多组参数和fixtures
pytest_generate_tests 允许定义自定义参数化方案或扩展(拓展)

用到的场景

只有测试数据和期望结果不一样,但是操作步骤是一样的测试用例可以用参数化

未参数化代码如下:

def test_1():
    assert 3 + 5 == 9

def test_2():
    assert 2 + 4 == 6

def test_3():
    assert 6 * 9 == 42

参数化代码如下:

@pytest.mark.parametrize("test_input,expected",[("3+5",8),("2+4",6),("6*9",42)])
def test_eval(test_input,expected):
    print(f"测试数据{test_input},"期望结果"{expected}")
    assert eval(test_input) == expected
    
实际web ui自动化中的开发场景,比如一个登录框

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

源码分析
def parametrize(self,argnames, argvalues, indirect=False, ids=None, scope=None):

argnames:参数名字
格式:字符串"arg1,arg2,arg3"【需要用逗号分隔】
@pytest.mark.parametrize("name,pwd", [("yy1", "123"), ("yy2", "123")])

argvalues:参数值列表
格式:必须是列表,如:[ val1,val2,val3 ]
如:@pytest.mark.parametrize("username", ["yy", "yy2", "yy3"])
如果有多个参数例,则需要用元组来存放值,一个元组对应一组参数的值,
如:@pytest.mark.parametrize("name,pwd", [("yy1", "123"), ("yy2", "123"), ("yy3", "123")])

indirect=False
作用:如果设置成True,则把传进来的参数当函数执行,而不是一个参数

ids:用例的ID
格式:传一个字符串列表
作用:可以标识每一个测试用例,自定义测试数据结果的显示,为了增加可读性
强调:ids的长度需要与测试数据列表的长度一致

装饰测试类
代码如下:

@pytest.mark.parametrize('a, b, expect', data_1)
class TestParametrize:

    def test_parametrize_1(self, a, b, expect):
        print('\n测试函数11111 测试数据为\n{}-{}'.format(a, b))
        assert a + b == expect

    def test_parametrize_2(self, a, b, expect):
        print('\n测试函数22222 测试数据为\n{}-{}'.format(a, b))
        assert a + b == expect

当装饰器 @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
这种方式,最终生成的用例数是nm,比如上面的代码就是:参数a的数据有3个,参数b的数据有2个,所以最终的用例数有32=6条
当参数化装饰器有很多个的时候,用例数都等于nnnn....

参数化,传入字典
代码如下:

# 字典
data_1 = (
    {
        'user': 1,
        'pwd': 2
    },
    {
        'user': 3,
        'pwd': 4
    }
)


@pytest.mark.parametrize('dic', data_1)
def test_parametrize_1(dic):
    print(f'测试数据为\n{dic}')
    print(f'user:{dic["user"]},pwd{dic["pwd"]}')

参数化,标记数据
代码如下:

# 标记参数化
@pytest.mark.parametrize("test_input,expected", [
    ("3+5", 8),
    ("2+4", 6),
    pytest.param("6 * 9", 42, marks=pytest.mark.xfail),
    pytest.param("6*6", 42, marks=pytest.mark.skip)
])
def test_mark(test_input, expected):
    assert eval(test_input) == expected

参数化 增加可读性
代码如下:

# ids
ids = ["a:{} + b:{} = expect:{}".format(a, b, expect) for a, b, expect in data_1]

@pytest.mark.parametrize('a, b, expect', data_1, ids=ids)
class TestParametrize(object):

    def test_parametrize_1(self, a, b, expect):
        print('测试函数1测试数据为{}-{}'.format(a, b))
        assert a + b == expect

    def test_parametrize_2(self, a, b, expect):
        print('测试函数2数据为{}-{}'.format(a, b))
        assert a + b == expect

多少组数据,就要有多少个id,然后组成一个id的列表
作用:主要是为了更加清晰看到用例的含义


参考链接
https://www.cnblogs.com/poloyy/p/12675457.html

相关文章

  • Pytest学习9 -参数化@pytest.mark.param

    前言 pytest允许在多个级别启用测试参数化: pytest.fixture() 允许fixture有参数化功能...

  • [接口测试_B] 05 Pytest参数化处理

    pytest的参数化方式 pytest.fixture()方式进行参数化,fixture装饰的函数可以作为参数传入...

  • pytest常用装饰器

    一、parametrize--参数化pytest中装饰器@pytest.mark.parametrize('参数名...

  • Chapter 13 参数化

    Chapter 13 参数化 pytest有如下几种参数化的方式: pytest.fixture()可以对测试函数...

  • pytest学习笔记---3

    接着上一篇的内容,这里主要讲下参数化,pytest很好的支持了测试函数中变量的参数化 一、pytest的参数化 1...

  • python学习之路_接口参数化2

    python接口参数化2 使用@pytest.mark.parametrize进行参数化 代码 响应代码

  • Python参数化用例

    主要内容: pytest 数据参数化 yaml的基本使用 pytest 数据参数化 第一步:数据存放在py文件中第...

  • pytest-09-参数化parametrize+命令行传参

    1、参数化parametrize (1)测试用例参数化使用装饰器 pytest.mark.parametrize ...

  • Pytest 参数化

    参数化,就是把测试过程中的数据提取出来,通过参数传递不同的数据来驱动用例运行。其实也就是数据驱动的概念。 在 Un...

  • pytest参数化

    conftest.py文件: test_*.py文件: indirect=True,把open_url当做函数去执行

网友评论

    本文标题:Pytest学习9 -参数化@pytest.mark.param

    本文链接:https://www.haomeiwen.com/subject/mmmpbktx.html