1.parametrize的简单应用
@pytest.mark.parametrize(argnames, argvalues, indirect=False, ids=None, scope=None)argnames:
这是传递给测试函数的参数名称,可以是一个字符串(表示一个参数)或一个列表(表示多个参数)。它指定了要传递的参数名称,这些参数会在测试函数中作为输入。
示例 1(一个参数):
import pytest
@pytest.mark.parametrize("num", [1, 2, 3])
def test_is_odd(num):
assert num % 2 == 1
在这个例子中,num 是一个参数,测试会为 num 提供 1、2、3 作为输入,分别执行三次测试。
示例 2(多个参数):
import pytest
@pytest.mark.parametrize("num1, num2", [(1, 2), (3, 4), (5, 6)])
def test_addition(num1, num2):
assert num1 + num2 == 3这里 num1 和 num2 是两个参数,测试会依次传入 (1, 2)、(3, 4)、(5, 6) 三组数据进行测试。

argvalues:
这是一个 值列表,表示要传给测试函数的具体参数值。每个元素都对应于 argnames 中的参数,它们将按顺序传递给测试函数。
在上面的例子中,argvalues 就是 [1, 2, 3] 或 [(1, 2), (3, 4), (5, 6)]。
indirect(默认为 False):
该参数用于指示 间接传参(indirect parameterization)。如果设置为 True,那么 argvalues 中的每个值将作为 fixture 名称传递给 Pytest,而不是直接作为参数传递给测试函数。这样,可以通过 fixture 动态地生成测试数据。
import pytest
@pytest.fixture
def provide_data(request):
return request.param * 2
@pytest.mark.parametrize("provide_data", [1, 2, 3], indirect=True)
def test_double(provide_data):
assert provide_data in [2, 4, 6]
ids:
这是一个可选的参数,用来指定每个参数组合的标识符(ID)。可以为每组测试数据指定一个字符串标识符,方便测试报告中的查看和区分。ids 的值可以是一个列表或一个函数。如果没有设置 ids,Pytest 会自动为每组数据生成标识符。
import pytest
@pytest.mark.parametrize("num", [1, 2, 3], ids=["one", "two", "three"])
def test_is_odd(num):
assert num % 2 == 1

5. scope:
该参数指定了 fixture 的作用域。它并不是 pytest.mark.parametrize 中常用的参数,但有时会看到这个参数用在 fixture 配合 parametrize 使用中。常见的 scope 选项包括:
"function":每个测试函数都会执行一次fixture(默认值)。"class":每个测试类都会执行一次fixture。"module":每个模块都会执行一次fixture。"session":在整个测试会话期间只执行一次fixture。
这个参数与 pytest.fixture 配合使用时才有效,和 pytest.mark.parametrize 结合时并不常见。