python 如何使用pytest禁用测试?

ddarikpa  于 2023-04-04  发布在  Python
关注(0)|答案(7)|浏览(207)

假设我有一堆测试:

def test_func_one():
    ...

def test_func_two():
    ...

def test_func_three():
    ...

有没有一个装饰器或类似的东西,我可以添加到函数中,以防止pytest只运行那个测试?结果可能看起来像...

@pytest.disable()
def test_func_one():
    ...

def test_func_two():
    ...

def test_func_three():
    ...
cgfeq70w

cgfeq70w1#

Pytest有skip和skipif装饰器,类似于Python unittest模块(使用skipskipIf),可以在这里的文档中找到。
链接中的示例可以在这里找到:

@pytest.mark.skip(reason="no way of currently testing this")
def test_the_unknown():
    ...

import sys
@pytest.mark.skipif(sys.version_info < (3,3),
                    reason="requires python3.3")
def test_function():
    ...

第一个示例总是跳过测试,第二个示例允许您有条件地跳过测试(当测试依赖于平台、可执行版本或可选库时,这很好。
例如,如果我想检查是否有人安装了库pandas进行测试。

import sys
try:
    import pandas as pd
except ImportError:
    pass

@pytest.mark.skipif('pandas' not in sys.modules,
                    reason="requires the Pandas library")
def test_pandas_function():
    ...
c6ubokkw

c6ubokkw2#

skip装饰器可以完成以下工作:

@pytest.mark.skip(reason="no way of currently testing this")
def test_func_one():
    # ...

reason参数是可选的,但最好指定跳过测试的原因)。
还有skipif(),允许在满足某些特定条件时禁用测试。
这些装饰器可以应用于方法、函数或类。
要跳过模块中的所有测试,请定义一个全局变量pytestmark

# test_module.py
pytestmark = pytest.mark.skipif(...)
5sxhfpxr

5sxhfpxr3#

当您想跳过pytest中的测试时,可以使用skipskipif装饰器标记测试。

跳过测试

@pytest.mark.skip(reason="no way of currently testing this")
def test_func_one():
    ...

跳过测试的最简单方法是使用skip装饰器标记它,该装饰器可以传递一个可选的reason
也可以在测试执行或设置期间通过调用pytest.skip(reason)函数强制跳过。当在导入期间无法评估跳过条件时,这很有用。

def test_func_one():
    if not valid_config():
        pytest.skip("unsupported configuration")

根据条件跳过测试

@pytest.mark.skipif(sys.version_info < (3, 6), reason="requires python3.6 or higher")
def test_func_one():
    ...

如果你想根据条件跳过,那么你可以使用skipif。在前面的例子中,当在Python3.6之前的解释器上运行时,测试函数被跳过。
最后,如果您想跳过一个测试,因为您确信它会失败,您也可以考虑使用xfail标记来指示您预期测试会失败。

vlf7wbxs

vlf7wbxs4#

如果您想跳过测试,但不想硬编码标记,最好使用关键字表达式来转义它。

pytest test/test_script.py -k 'not test_func_one'

注意:这里的'keyword expression'基本上是,使用pytest(或python)提供的关键字表达一些东西并完成一些事情。我上面的例子,'not'是一个关键字。
有关更多信息,请参阅此链接。
更多关键字表达式的例子可以在this answer中找到。

falq053o

falq053o5#

我不确定它是否已被弃用,但你也可以在测试中使用pytest.skip函数:

def test_valid_counting_number():
     number = random.randint(1,5)
     if number == 5:
         pytest.skip('Five is right out')
     assert number <= 3
xkftehaa

xkftehaa6#

即使您怀疑测试会失败,您也可能希望运行测试。

@pytest.mark.xfail
def test_function():
    ...

在这种情况下,Pytest仍然会运行你的测试,让你知道它是否通过,但不会抱怨和破坏构建。

4si2a6ki

4si2a6ki7#

您可以通过自定义pytest标记在测试用例集上划分测试,并仅执行您想要的那些测试用例。或者相反,运行除另一组之外的所有测试:

@pytest.mark.my_unit_test
def test_that_unit():
...

@pytest.mark.my_functional_test
def test_that_function():
...

然后,只运行一组单元测试,例如:pytest -m my_unit_test
如果要运行除一组测试之外的所有测试,则执行相反操作:pytest -m "not my_unit_test"
How to combine several marks
More examples in official documentation
如果你有良好的测试用例逻辑分离,看起来会更方便。

相关问题