5.@pytest.mark.parametrize()数据驱动
阅读原文时间:2023年07月08日阅读:2

简介:

  • pytest.mark.parametrize 是 pytest 的内置装饰器,它允许你在 function 或者 class 上定义多组参数和 fixture 来实现数据驱动。
  • @pytest.mark.parametrize() 装饰器接收两个参数:
  • 第一个参数以字符串的形式存在,它代表能被被测试函数所能接受的参数,如果被测试函数有多个参数,则以逗号分隔;
  • 第二个参数用于保存测试数据。如果只有一组数据,以列表的形式存在,如果有多组数据,以列表嵌套元组的形式存在(例如:[1,1]或者[(1,1),(2,2)])

格式

@pytest.mark.parametrize(args_name,args_value)
args_name:参数名
args_value:参数值(列表,元组,字典列表,字典元组)
有多少个值,用例就会执行多少次

示例:value是列表

import pytest

class TestApi:

    @pytest.mark.parametrize('keyName', ['v1', 'v2'])
    def test_01_api(self, keyName):
        """
        keyName有两个值,所有会执行两次
        这里的keyName每次的结果对应的v1和v2
        """
        print(keyName) 

    def test_02_api(self):
        ...

示例:列表套列表

class TestApi:
    # 两个name,列表套列表
    @pytest.mark.parametrize('keyName,name2', [['v1', 'v2'],['v3','v4']])
    def test_01_api(self, keyName,name2):
        """
        实际效果是keyname对应v1,name2对应v2
        keyname对应v3,name2对应v4
        与unittest的ddt里面的@unpack解包一样
        """
        print(keyName,name2)

    def test_02_api(self):
        ...

   

pytest.mark.parametrize和pytest.fixtrue结合使用

如果测试数据需要在 fixture 方法中使用,同时也需要在用例中使用,可以让 parametrize 的 indirect 参数为 True

indirect = True,pytest 会把 argnames 当做函数执行,将 argvalues 作为参数传入到 argnames 函数中

 class TestApi:
    # 定义fixture
    @pytest.fixture()
    def my_data(self, request):
        return request.param

    # 将fixtrue方法传入argname,indirect声明
    @pytest.mark.parametrize('my_data', [1, 2, 3], indirect=True)
    def test_01_api(self, my_data):
        print(my_data)

    def test_02_api(self):
        ...

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器