说我有一堆测试:
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文档中搜索过类似的内容,但我想我可能会遗漏一些内容。
答案 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
标记来表示您期望测试失败。