繁体   English   中英

如何使用 pytest 跳过参数化测试

[英]How to skip parametrized tests with pytest

是否可以有条件地跳过参数化测试?
这是一个例子:

@pytest.mark.parametrize("a_date", a_list_of_dates)
@pytest.mark.skipif(a_date > date.today())
def test_something_using_a_date(self, a_date):
    assert <some assertion>

当然我可以在测试方法中做到这一点,但我正在寻找一种结构化的方法来做到这一点pytest

可以做到这一点,尽管这取决于你想要什么,它可能需要一些工作。

如果您只需要跳过特定的参数集(即,如果您不需要使用表达式来确定要跳过哪些参数集),这很容易:

@pytest.mark.parametrize("a", [
    1,
    pytest.param(2, marks=[pytest.mark.skip]),
])
def test_a(a):
    assert a == 1

如果您确实需要使用表达式,那么我认为最好的方法是编写自定义pytest_runtest_setup挂钩。 这个钩子可以访问每个测试的标记和参数,所以它是实现你想要的那种逻辑的好地方。 基本思想是从自定义标记中获取跳过条件,在参数的上下文中评估该条件,然后根据结果跳过:

# conftest.py
import pytest

def pytest_runtest_setup(item):
    skip_funcs = [
            mark.args[0]
            for mark in item.iter_markers(name='parametrize_skip_if')
    ]
    if any(f(**item.callspec.params) for f in skip_funcs):
        pytest.skip()
# test_file.py
@pytest.mark.parametrize("b", [1, 2])
@pytest.mark.parametrize_skip_if(lambda b: b == 2)
def test_b(b):
    assert b == 1

如果您创建自己的方法,则检查测试收集时间中的值

a_list_of_dates = [date.today(), date(2024, 1, 1), date(2022, 1, 1)]

def get_dates():
    for d in a_list_of_dates:
        if d <= date.today():
            yield d

class TestSomething:
    @pytest.mark.parametrize("a_date", get_dates())
    def test_something_using_a_date(self, a_date):
        print(a_date)

Output

TestSomething::test_something_using_a_date[a_date0] PASSED [ 50%] 2022-08-24
TestSomething::test_something_using_a_date[a_date1] PASSED [100%] 2022-01-01

如果您仍然想要跳过的测试,您可以将skip标记添加到相关测试

def get_dates():
    for d in a_list_of_dates:
        markers = []
        if d > date.today():
            markers.append(pytest.mark.skip(reason=f'{d} is after today'))
        yield pytest.param(d, marks=markers)

Output

TestSomething::test_something_using_a_date[a_date0] PASSED [ 33%] 2022-08-24

TestSomething::test_something_using_a_date[a_date1] SKIPPED (2024-01-01 is after today) [ 66%]
Skipped: 2024-01-01 is after today

TestSomething::test_something_using_a_date[a_date2] PASSED [100%] 2022-01-01

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM