pytest的参数化处理

Posted 永远不要矫情

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pytest的参数化处理相关的知识,希望对你有一定的参考价值。

在pytest中,可以使用参数化测试,即每组参数都独立执行一次测试。使用的是:pytest.mark.parametrize(argnames,argvalues).传入的数据格式可以是:

  • 列表
  • 元祖
  • 字典

1.列表
代码如下:test_01函数会执行两次,因为列表中有两个值。

import pytest

# 列表
data = ['123', '456']

@pytest.mark.parametrize('pwd', data)
def test_01(pwd):
    print(pwd)

输出:

============================= test session starts =============================
collecting ... collected 2 items

test_para.py::test_1[123] PASSED                                         [ 50%]123

test_para.py::test_1[456] PASSED                                         [100%]456


============================== 2 passed in 0.02s ==============================

2.元组
代码如下所示,在列表中包含两个元组的值,函数有三个参数,且也会执行两遍。

data2 = [
    (1, 2, 3),  # 或者[1, 2,3]
    (4, 5, 6)  # 或者[4, 5,6]
]


@pytest.mark.parametrize('a, b, c', data2)
def test_2(a, b, c):
    print(a, b, c)
============================= test session starts =============================
collecting ... collected 2 items

test_para.py::test_2[1-2-3] PASSED                                       [ 50%]1 2 3

test_para.py::test_2[4-5-6] PASSED                                       [100%]4 5 6


============================== 2 passed in 0.02s ==============================

3.字典

# 字典

data3 = (
    {
        'user': 1,
        'pwd': 2
    },
    {
        'user': 3,
        'pwd': 4
    }
)


@pytest.mark.parametrize('dic', data3)
def test_3(dic):
    print(dic)

输出如下:

============================= test session starts =============================
collecting ... collected 2 items

test_para.py::test_3[dic0] PASSED                                        [ 50%]{'user': 1, 'pwd': 2}

test_para.py::test_3[dic1] PASSED                                        [100%]{'user': 3, 'pwd': 4}


============================== 2 passed in 0.02s ==============================

4.参数ids
参数化装饰器有一个额外的参数ids,可以标识每一个测试用例,自定义测试数据结果的显示,为了增加可读性。
代码如下:

data_1 = [
    pytest.param(1, 2, 3, id="(a+b):pass"),  # id的值可以自定义, 只要方便理解每个用例是干什么的即可
    pytest.param(4, 5, 10, id="(a+b):fail")
]


def add(a, b):
    return a + b


class TestParametrize(object):

    @pytest.mark.parametrize('a, b, expect', data_1)
    def test_parametrize_1(self, a, b, expect):
        assert add(a, b) == expect

输出:

============================= test session starts =============================
collecting ... collected 2 items

test_para.py::TestParametrize::test_parametrize_1[(a+b):pass] 
test_para.py::TestParametrize::test_parametrize_1[(a+b):fail] PASSED     [ 50%]FAILED     [100%]
test_para.py:54 (TestParametrize.test_parametrize_1[(a+b):fail])

以上是关于pytest的参数化处理的主要内容,如果未能解决你的问题,请参考以下文章

pytest参数化:@pytest.mark.parametrize

pytest数据参数化和数据驱动yaml的简单使用

pytest05-参数化

pytest参数化实现DDT:读取JSON数据

Python基础之pytest参数化

混合参数化和skipif时Pytest不跳过测试