如何使用 pytest 禁用测试?

假设我有一堆测试:

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():
...
139757 次浏览

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(...)

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():
...

第一个示例总是跳过测试,第二个示例允许您有条件地跳过测试(当测试依赖于平台、可执行版本或可选库时非常好)。

例如,如果我想检查某人是否安装了用于测试的库熊猫。

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():
...

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

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

即使怀疑测试会失败,您也可能希望运行该测试。对于这种情况,https://docs.pytest.org/en/latest/skipping.html建议使用装饰器 @ pytest. mark.xfall

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

在这种情况下,Pytest 仍然会运行您的测试并通知您测试是否通过,但是不会抱怨并中断构建。

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

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

注意: 这里的“ 关键字表达式”基本上是使用 pytest (或 python)提供的关键字表达某些内容并完成某些工作。我上面的例子中,‘ not’是一个关键词。

更多信息,请参考此 链接

更多关键字表达式的例子: 请参考 这个答案

当您想跳过 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代替。在前面的示例中,当在 Python 3.6之前的解释器上运行时,将跳过 test 函数。

最后,如果您因为确定某个测试失败而想要跳过它,那么您还可以考虑使用 xfail标记来表明您期望某个测试失败。

您可以通过自定义 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"

如何组合几个分数

官方文件中的更多示例

如果您对测试用例有良好的逻辑分离,那么它看起来更方便。