python pytest.mark.parametrize 用法详解
pytest.mark.parametrize
是pytest测试框架中一个非常实用的装饰器,它允许你使用多组参数来运行同一个测试函数,从而使得测试用例更加简洁且易于维护。以下是pytest.mark.parametrize
的详细用法:
基本用法:
最基本的使用方式是直接传递参数值列表。例如:import pytest @pytest.mark.parametrize("x, y, expected", [(1, 2, 3), (4, 5, 9)]) def test_add(x, y, expected): assert x + y == expected
在这个例子中,
test_add
函数会被执行两次,分别使用(1, 2, 3)
和(4, 5, 9)
作为参数。使用命名参数:
可以为每组参数指定一个名字,以增加可读性。例如:@pytest.mark.parametrize("x, y, expected", [ pytest.param(1, 2, 3, id='positive_numbers'), pytest.param(-1, -1, -2, id='negative_numbers'), ]) def test_add_named(x, y, expected): assert x + y == expected
嵌套参数:
支持嵌套参数列表,适用于多维度测试。例如:@pytest.mark.parametrize("x", [1, 2]) @pytest.mark.parametrize("y", [3, 4]) def test_multiply(x, y): assert x * y in [3, 4, 6, 8]
参数组合:
使用pytest.param
可以显式控制参数组合及标识。例如:@pytest.mark.parametrize("a, b, expected", [ pytest.param(1, 2, 3, id="integers"), pytest.param(1.5, 2.5, 4.0, id="floats"), ]) def test_add_combinations(a, b, expected): assert a + b == expected
参数类型转换:
在传递给测试函数之前,可以自动转换参数类型。例如:@pytest.mark.parametrize("x, y", [("1", "2"), ("3", "4")], ids=["str-str", "str-str"]) def test_add_str_converted(x, y): x = int(x) y = int(y) assert x + y in [3, 7]
异常测试:
可以使用pytest.raises
来检查特定异常。例如:@pytest.mark.parametrize("x, y", [(1, 'a')]) def test_add_exception(x, y): with pytest.raises(TypeError): x + y
参数化fixture:
可以参数化fixture,使其在每次调用时使用不同的输入。例如:@pytest.fixture(params=[1, 2]) def number(request): return request.param def test_number(number): assert number in [1, 2]
- 大范围数据测试:
可以使用外部数据源(如文件、数据库)动态生成参数。这种方式通常需要结合其他工具或方法来实现。
通过熟练掌握pytest.mark.parametrize
的用法,你可以更加灵活地编写测试用例,提高测试效率和代码质量。
评论已关闭