如何使用pytest禁用测试?


86

假设我有很多测试:

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

Answers:


133

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

有什么类似于.skip摩卡(Node.js)的优雅吗?it('tests something'...)->it.skip('tests something'...)会禁用该特定测试。它也有一个方便的对立面:.only它只会运行该测试,而不会执行其他任何操作。
Juha Untinen

我的意思是,就only部分而言,您可以通过命令行或用于初始化测试运行程序的任何方法来做到这一点:stackoverflow.com/a/36539692/4131059 至于itand it.skip,我相信这里的功能可以完全覆盖这一点。
亚历山大·侯萨

21

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

10

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

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

2
来寻求pytest帮助,留下来供参考
Uzebeckatrente

它引用了什么。我必须知道
XChikuX


恐怕在我的时间之前还不错。但是,很高兴我现在知道了。
XChikuX

6

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

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

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



1

要在中跳过测试,可以使用skipskipif装饰器标记测试pytest

跳过测试

@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之前的解释器上运行时,将跳过test函数。

最后,如果因为确定失败而要跳过测试,则还可以考虑使用xfail标记来表示您期望测试失败。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.