如何使用py.test禁用测试?

时间:2016-07-18 17:41:45

标签: python testing

说我有一堆测试:

def test_func_one():
    ...

def test_func_two():
    ...

def test_func_three():
    ...

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

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

def test_func_two():
    ...

def test_func_three():
    ...

我在py.test文档中搜索过类似的内容,但我想我可能会遗漏一些内容。

6 个答案:

答案 0 :(得分:61)

Pytest有skip和skipif装饰器,类似于Python unittest模块(使用<DataGrid HeadersVisibility="Column" ItemsSource="{Binding Path=DevLengths}" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" CanUserReorderColumns="False" CanUserResizeRows="False" CanUserResizeColumns="False" BorderThickness="1,1,1,0"> <DataGrid.Columns> <DataGridTextColumn Header="Size" Binding="{Binding Id}" IsReadOnly="True"/> <DataGridTextColumn Header="Length of Splice" Binding="{Binding LengthOfSplice}"/> <DataGridTextColumn Header="Length of Development" Binding="{Binding LengthOfDevelopment}"/> <DataGridTextColumn Header="Ldh" Binding="{Binding Ldh}"/> <DataGridTextColumn Header="Length of Hook" Binding="{Binding LengthOfHook}" Width="*"> <DataGridTextColumn.CellStyle> <Style TargetType="DataGridCell"> <Setter Property="Margin" Value="0,0,-1,0"/> </Style> </DataGridTextColumn.CellStyle> </DataGridTextColumn> </DataGrid.Columns> </DataGrid> skip),可以在文档here中找到。

链接中的示例可以在这里找到:

skipIf

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

例如,如果我想检查是否有人为测试安装了库pandas。

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

答案 1 :(得分:14)

skip decorator可以胜任:

$.get('http://stackexchange.com/tour/', function(html) {
    if ($("#search")[0]){
        alert('search available'); 
    }
    else {
         alert("search is not available");
     }
});

@pytest.mark.skip(reason="no way of currently testing this") def test_func_one(): # ... 参数是可选的,但指定跳过测试的原因总是一个好主意。

还有skipif()允许在满足某些特定条件时禁用测试。

这些装饰器可以应用于方法,函数或类。

skip all tests in a module,请定义全局reason变量:

pytestmark

答案 2 :(得分:4)

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

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

答案 3 :(得分:4)

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

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

在这种情况下,Pytest仍然可以运行你的测试,如果它通过或现在就让你现在,但不会抱怨并破坏构建。

答案 4 :(得分:2)

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

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

答案 5 :(得分:1)

要跳过pytest中的测试,可以用^ : match start of line (?: : begin non-capture group ^ : march beginning of line | : or (?!^) : negative lookahead asserts current position is not the beginning of a line \G : asserts position at the end of the previous match or the start of the string for the first match ) : end non-capture group (?= : begin positive lookahead [^-\/|\n]* : match 0+ chars other than those listed ([-\/|]) : match '-', '/' or '|' and save to capture group 1 (?: : begin non-capture group [^-\/|\n]* : match 0+ chars other than those listed \1 : match the content of capture group 1 )* : end non-capture group and execute 0+ times [^-\/|\n]* : match 0+ chars other than those listed (?!\1) : negative lookahead asserts next char is not the content of capture group 1 ([-\/|]) : match one of the characters listed and save to capture group 2 ) : end positive lookahead (?: : begin non-capture group (?!\2) : negative lookahead asserts next char does not : equal the content of capture group 2 . : match any char )* : end non-capture group and execute 0+ times \K : reset the starting point of the reported match and exclude any previously-consumed characters from the reported match \2 : match the content of capture group 2 skip装饰器标记测试。

跳过考试

skipif

跳过测试的最简单方法是使用@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(): ... 。在上一个示例中,在早于Python3.6的解释器上运行时,将跳过测试功能。

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