Skip to content

Pytest Fixture 参数化


简介

pytest 还支持参数化 fixture,即可以为一个 fixture 提供多个不同的值,让多个测试用例使用不同的测试数据。

这样可以有效减少重复代码,尤其适合测试多组输入输出的情况。


基本语法

  • params:传入一个列表,包含 Fixture 的不同参数。
  • request.param:可以在 Fixture 函数中通过 request.param 获取当前参数。
import pytest

@pytest.fixture(params=[param1, param2, param3, ...])
def fixture_name(request):
    return request.param

单参数

import pytest

@pytest.fixture(params=[1, 2, 3])
def number(request):
    return request.param

def test_number(number):
    assert number > 0

运行结果:


多参数

import pytest

@pytest.fixture(params=[
   ["selenium", 123],
   ["appium", 123456]
])
def login(request):
    print(f"用户名:{request.param}")
    yield request.param

def test_demo(login):
    print(f"demo case: 数据为: {login}")

运行结果:


fixture 与 parametrize 结合实现参数化

  • 通过 parametrize 中设置 indirect=True 可以将参数传递到指定的 Fixture 中
import pytest

@pytest.fixture
def database(request):
    # database fixture 接收 request.param,返回数据库连接字符串。
    db_name = request.param
    return f"连接数据库: {db_name}"

# @pytest.mark.parametrize 使用 indirect=True 将参数传递给 database fixture
@pytest.mark.parametrize(
   "database", 
   ["test_db1", "test_db2"],
   indirect=True
)
def test_database_connection(database):
    print(f"database = {database}")
    assert "连接数据库" in database

运行结果:


总结

  • Pytest Fixture 参数化的使用。