九、skip和xfail标记

一些测试用例只能在特定的条件或平台执行,或者是已知的Bug影响。在执行这些用例时提前打上标记,Pytest可以相应的处理并输出更准确的报告。

在这种场景下,常用的标记有:

  • skip:只有当某些条件得到满足时,才执行测试用例,否则跳过整个测试用例的执行;例如,在非Windows平台上跳过只支持Windows系统的用例;
  • xfail:因为一个确切的原因,知道这个用例会失败;例如,对某个未实现的功能的测试,或者阻塞于某个已知Bug的测试;

pytest默认不显示skipxfail用例的详细信息,可以通过-r选项来自定义这种行为;

通常,使用一个字母作为一种类型的代表,具体的规则如下:(f)ailed, (E)rror, (s)kipped, (x)failed, (X)passed, (p)assed, (P)assed with output, (a)ll except passed(p/P), or (A)ll

1、跳过测试用用例执行

(1)pytest.mark.skip装饰器

 

(2)pytest.skip():在测试执行期间(也可以在SetUp/TearDown期间)强制跳过后续的步骤,可以考虑pytest.skip()方法,它同样可以设置一个参数msg,表明跳过的原因;

 

 

 

(3)@pytest.mark.skipif装饰器:有条件的跳过某些测试用例的执行,可以使用@pytest.mark.skipif装饰器;注意:不存在pytest.skipif()的方法;

 

 

 

(4)pytest.importorskip方法:当引入某个模块失败时,同样可以跳过后续部分的执行;

(5)在类上也可以应用@pytest.mark.skip@pytest.mark.skipif;

(6)跳过测试模块:在模块中定义pytestmark变量

 

 

 或者,在模块中调用pytest.skip方法,并设置allow_module_level=True

 

 

 

(7)跳过指定的文件和目录

通过在conftest.py中配置collect_ignore_glob项,可以在用例的收集阶段跳过指定的文件和目录;

 

 (8)总结

 

 

 pytest.mark.skippytest.mark.skipifpytest.skippytest.importorskipconftest.py
用例 @pytest.mark.skip() @pytest.mark.skipif() pytest.skip(msg='') / /
@pytest.mark.skip() @pytest.mark.skipif() / / /
模块 pytestmark = pytest.mark.skip() pytestmark = pytest.mark.skipif() pytest.skip(allow_module_level=True) pytestmark = pytest.importorskip() /
文件或目录 / / / / collect_ignore_glob

 

2、标记用例为预期失败

使用@pytest.mark.xfail标记用例,表示期望这个用例执行失败;用例会正常执行,只是失败时不再显示堆栈信息,最终的结果有两个:用例执行失败时(XFAIL:符合预期的失败)、用例执行成功时(XPASS:不符合预期的成功)。

 

 

 

也可以通过pytest.xfail方法在用例执行过程中直接标记用例结果为XFAIL,并跳过剩余的部分:

总结不同参数组合对测试结果的影响(其中xfail = pytest.mark.xfail):

 

 

 

去使能

通过命令行选项pytest --runxfail来去使能xfail标记,使这些用例变成正常执行的用例,仿佛没有被标记过一样:

同样,pytest.xfail()方法也将会失效;

 

 

3、结合Pytest.param

pytest.param方法可用于为@pytest.mark.parametrize或者参数化的fixture指定一个具体的实参,它有一个关键字参数marks,可以接收一个或一组标记,用于标记这轮测试的用例;

 

posted @ 2020-03-24 20:05  晨尛  阅读(360)  评论(0编辑  收藏  举报