如何为pytest fixture传递参数?实现测试用例传入max_count值
pytest支持从测试用例向fixture传递参数
pytest完全支持从测试用例向fixture传递自定义参数,下面给你几种实用的实现方式:
方法1:结合pytest.mark.parametrize和fixture的request对象
通过测试用例参数化,把max_count的值传递给fixture,fixture通过request.param获取该值。
示例代码:
定义fixture
import pytest @pytest.fixture def new_instance_demo(request, instance_name, os_demo, config): # 从测试用例的参数中获取max_count max_count = request.param instance = os_demo.create_server( instance_name, image=config.image.images_list[0], flavor=config.launch_instances.flavor, availability_zone=config.launch_instances.available_zone, network=config.network.external_network, wait=True, max_count=max_count, ) yield instance os_demo.delete_server(instance_name)
测试用例中传参
@pytest.mark.parametrize("new_instance_demo", [1, 2, 3], indirect=True) def test_instance_creation(new_instance_demo): # 测试逻辑 assert new_instance_demo is not None
这里的indirect=True是核心配置,它告诉pytest将参数传递给fixture处理,而非直接作为测试用例的入参。
方法2:用测试用例的自定义标记(marker)
给测试用例添加自定义标记,fixture通过request.node.get_closest_marker提取标记中的max_count值。
示例代码:
定义fixture
import pytest @pytest.fixture def new_instance_demo(request, instance_name, os_demo, config): # 获取测试用例的标记参数,无标记时使用默认值1 marker = request.node.get_closest_marker("max_count") max_count = marker.args[0] if marker else 1 instance = os_demo.create_server( instance_name, image=config.image.images_list[0], flavor=config.launch_instances.flavor, availability_zone=config.launch_instances.available_zone, network=config.network.external_network, wait=True, max_count=max_count, ) yield instance os_demo.delete_server(instance_name)
测试用例中传参
@pytest.mark.max_count(2) def test_instance_with_maxcount_2(new_instance_demo): assert new_instance_demo is not None @pytest.mark.max_count(3) def test_instance_with_maxcount_3(new_instance_demo): assert new_instance_demo is not None
方法3:让fixture直接接受测试用例传递的参数
如果测试用例本身需要使用max_count,可以直接将其作为测试用例参数,同时让fixture依赖该参数。
示例代码:
定义fixture
import pytest @pytest.fixture def new_instance_demo(instance_name, os_demo, config, max_count): instance = os_demo.create_server( instance_name, image=config.image.images_list[0], flavor=config.launch_instances.flavor, availability_zone=config.launch_instances.available_zone, network=config.network.external_network, wait=True, max_count=max_count, ) yield instance os_demo.delete_server(instance_name)
测试用例中传参
@pytest.mark.parametrize("max_count", [1, 2]) def test_instance_with_different_counts(new_instance_demo, max_count): assert new_instance_demo is not None # 可直接使用max_count完成其他断言逻辑
三种方法中,方法1和方法3更常用;方法2适合不需要在测试用例中直接使用max_count的场景。
内容的提问来源于stack exchange,提问作者ashish_11
相关产品推荐
相关产品推荐

