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

这里 num1num2 是两个参数,测试会依次传入 (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 结合时并不常见。