使用skip和xfail处理无法成功的测试

可以标记无法在某些平台运行或预期会失败的测试函数,以便pytest能够相应地处理它们,并提供测试会话地摘要,同时保持测试套件的”通过“

跳过(skip)意味着期望测试仅在满足某些条件时才通过,否则pytest应该完全跳过运行该测试,常见的例子包括在非Windows平台上跳过仅限Windows的测试,或者跳过依赖当前不可用的外部资源(例如数据库)的测试

预期失败(xfail)意味着预期测试会因某种原因而失败,常见的例子是针对尚未实现的功能或尚未修复的错误测试,当一个测试尽管预期会失败(用pytest.mark.xfail标记)但却通过,就是意味通过(xpass),并将在测试摘要中报告

pytest会分别统计并列出skip和xfail测试,默认情况下不显示跳过/预期失败测试的详细信息,以避免输出混乱,可以使用-r选项查看测试进度中显示的”短“字母对应的详细信息

pytest -rxXs

一.跳过测试函数

跳过测试函数最简单的方法是使用skip装饰器标记它,该装饰器可以传递一个可选的reason参数

命令式方法在导入时无法评估跳出条件的情况下很有用

可以在模块级别使用pytest.skip(reason,allow_module_level=True)跳过整个模块

1.skipif

如果希望有条件地跳过某些内容,可以使用skipif,这是一个标记测试函数在早于Python3.10的解释器上运行时跳过的示例

在收集期间条件评估为True,则测试函数将被跳过,并在使用-rs时,其指定的原因将出现在摘要中

可以在模块之间共享skipif标记

可以导入该标记并在另一个测试模块中重用它

对于大型测试套件,通常最好有一个文件来定义标记,然后可以整个测试套件中一致地应用这些标记

可以使用条件字符串而不是布尔值,但不容易在模块之间共享,支持主要是为了向后兼容性原因

2.跳过类或模块的所有测试函数

可以在类上使用skipif标记(与其他任何标记一样)

如果条件为True,此标记将为该类的每个测试方法生成一个跳过结果

如果要跳过模块的所有测试函数,使用pytestmark全局变量

如果多个skipif装饰器应用于一个测试函数,只要任一跳过条件为真,该函数就会被跳过

3.跳过文件或目录

有时可能需要跳过整个文件或目录,如果测试依赖于特定Python版本的功能,或者包含您不希望pytest运行的代码,在这种情况下,必须将这些文字和目录从收集过程中排除

4.因缺少导入依赖而跳过

可以在模块级别、测试内部或测试设置函数中使用pytest.importorskip,以便因缺少导入而跳过测试

如果此处无法导入docutils,将导致测试跳过,也可以根据库的版本号进行跳过

版本将从指定模块的__version__属性中读取

5.总结

以下是在不同情况下跳过模块中测试的快速指南

无条件跳过模块中的所有测试

基于某些条件跳过模块中的所有测试

如果缺少某些导入,则跳过模块中的所有测试

二.XFil将测试函数标记为预期失败

可以使用xfail标记来指定预期某个测试会失败

该测试将运行,但当它失败时不会报告回溯,相反,终端报告会将其列在"预期失败"(XFAIL)或”意外通过“(XPASS)部分

可以在测试内部或其设置函数中命令式将测试标记为XFIL

这两个示例说明您不希望在模块级别检查条件的情况,否则这些条件将被评估为标记

这将使test_function变为XFAIL,请注意,与标记不同,在调用pytest.xfail()之后不会执行其他代码,因为在内部是通过引发一个已知异常来实现

1.condition参数

如果一个测试只预期在特定条件下失败,可以将该条件作为第一个参数传递

2.reason参数

可以使用reason参数指定预期失败的理由

3.raise参数

想要更具体地说明测试失败地原因,可以在raises参数中指定单个异常或异常元组

如果测试失败时抛出的异常未在raises中提及,则该测试将被报告为常规失败

4.run参数

如果一个测试应被标记为预期失败并如此报告,但甚至不应被执行,请将run参数设置为False

这对于预期失败的测试(导致解释器崩溃,需要稍后调查)特别有用

5.strict参数

默认情况下,XFAIL和XPASS都不会导致测试套件的失败,可以通过将仅限关键字的参数strict设置为True来更改此行为

这将使此测试的XPASS(”意外通过“)结果导致测试套件失败

可以使用xfail_strict ini选项更改strict参数的默认值

6.忽略xfail

通过在命令行指定

pytets --runxfail

可以强制运行并报告一个标记为xfail的测试,就像它根本没有被标记一样,会导致pytest.xfail()不产生任何效果

使用report-on-sfail选项运行它会的带以下输出

三.结合parametrize使用skip/xfail

在使用parametrize时,可以将skip和xfail等标记应用于单个测试用例

运行该测试

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐