python考试pass or fail_Pytest官方教程-12-skip及xfail: 处理不能成功的测试用例
目录:
skip及xfail: 处理不能成功的测试用例
你可以标记无法在某些平台上运行的测试用例或你希望失败的测试用例,以便pytest可以相应地处理它们并提供测试会话的摘要,同时保持测试套件为通过状态。
一个Skip意味着你希望如果某些条件得到满足你的测试才执行,否则pytest应该完全跳过运行该用例。常见示例是在非Windows平台上跳过仅限Windows的测试用例,或者跳过依赖于当前不可用的外部资源的测试用例(例如数据库)。
一个xfail意味着已知测试失败并标记原因。一个常见的例子是对尚未实现的功能的测试,或者尚未修复的错误。当测试通过时尽管预计会失败(标记为pytest.mark.xfail),但它在并将在测试摘要及报告中显示为xpass*.
pytest分别计算并列出skip和xfail测试。默认情况下不显示有关skip/ xfailed测试的详细信息,以避免输出混乱。你可以使用该-r选项查看与测试进度中显示的“短”字母对应的详细信息:
pytest -rxXs # show extra info on xfailed, xpassed, and skipped tests
-r可以通过运行找到有关该选项的更多详细信息。pytest -h
跳过测试用例
版本2.9中的新功能。
跳过测试用例的最简单方法是使用skip装饰器标记它,可以传递一个可选的reason:
@pytest.mark.skip(reason="no way of currently testing this")
def test_the_unknown():
...
或者,也可以通过调用pytest.skip(reason)函数在测试执行或设置期间强制跳过:
def test_function():
if not valid_config():
pytest.skip("unsupported configuration")
当在导入时间内无法评估跳过条件时,命令性方法很有用。
也可以在模块级别跳过整个模块 :pytest.skip(reason, allow_module_level=True)
import sys
import pytest
if not sys.platform.startswith("win"):
pytest.skip("skipping windows-only tests", allow_module_level=True)
skipif
2.0版中的新功能。
如果你希望有条件地跳过某些内容,则可以使用skipif。下面是一个标记在Python3.6之前的解释器上运行时要跳过的测试函数的示例:
import sys
@pytest.mark.skipif(sys.version_info < (3, 6), reason="requires python3.6 or higher")
def test_function():
...
如果条件True在收集期间评估为,则将跳过测试函数,使用时会在摘要中显示指定的原因-rs。
你可以skipif在模块之间共享标记。考虑这个测试模块:
# content of test_mymodule.py
import mymodule
minversion = pytest.mark.skipif(
mymodule.__versioninfo__ < (1, 1), reason="at least mymodule-1.1 required"
)
@minversion
def test_function():
...
你可以导入mark标记并在另一个测试模块中重复使用它:
# test_myothermodule.py
from test_mymodule import minversion
@minversion
def test_anotherfunction():
...
对于较大的测试套件,通常最好有一个文件来定义标记,然后在整个测试套件中一致地应用这些标记。
或者,你可以使用条件字符串而不是布尔值,但它们不能在模块之间轻松共享,因此主要出于向后兼容性原因支持它们。
跳过类或模块的所有测试用例
你可以skipif在类上使用标记(与任何其他标记一样):
@pytest.mark.skipif(sys.platform == "win32", reason="does not run on windows")
class TestPosixCalls(object):
def test_function(self):
"will not be setup or run under 'win32' platform"
如果条件是True,则此标记将为该类的每个测试方法生成跳过结果。
如果要跳过模块的所有测试用例,可以pytestmark在全局级别使用该名称:
# test_module.py
pytestmark = pytest.mark.skipif(...)
如果将多个skipif装饰器应用于测试用例,则如果任何跳过条件为真,则将跳过该装饰器。
跳过文件或目录
有时你可能需要跳过整个文件或目录,例如,如果测试依赖于Python版本特定的功能或包含你不希望运行pytest的代码。在这种情况下,你必须从集合中排除文件和目录。有关更多信息,请参阅自定义测试集合。
跳过缺少的导入依赖关系
你可以在模块级别或测试或测试setup方法中使用以下帮助程序:
docutils = pytest.importorskip("docutils")
如果docutils无法在此处导入,则会导致测试跳过结果。你还可以根据库的版本号跳过:
docutils = pytest.importorskip("docutils", minversion="0.3")
将从指定模块的__version__属性中读取版本。
摘要
以下是如何在不同情况下跳过模块中的测试用例的快速指南:
无条件地跳过模块中的所有测试用例:
pytestmark = pytest.mark.skip("all tests still WIP")
根据某些条件跳过模块中的所有测试用例:
pytestmark = pytest.mark.skipif(sys.platform == "win32", reason="tests for linux only")
如果缺少某些导入,则跳过模块中的所有测试用例:
pexpect = pytest.importorskip("pexpect")
XFail:将测试函数标记为预期失败
你可以使用xfail标记指示你希望测试失败:
@pytest.mark.xfail
def test_function():
...
将运行此测试,但在失败时不会报告回溯。相反,终端报告会将其列在“预期失败”(XFAIL)或“意外传递”(XPASS)部分中。
或者,你也可以XFAIL在测试或设置功能中强制标记测试:
def test_function():
if not valid_config():
pytest.xfail("failing configuration (but should work)")
这将无条件地制作test_function XFAIL。请注意,pytest.xfail调用后不会执行其他代码,与标记不同。那是因为它是通过引发已知异常在内部实现的。
strict参数
版本2.9中的新功能。
双方XFAIL并XPASS除非不失败的测试套件,strict只有关键字的参数作为传递True:
@pytest.mark.xfail(strict=True)
def test_function():
...
这将导致XPASS(“意外通过”)此测试的结果导致测试套件失败。
你可以strict使用xfail_strictini选项更改参数 的默认值:
[pytest]
xfail_strict=true
reason参数
与skipif一样,你也可以在特定平台上标记你对失败的期望:
= (3, 6), reason="python3.6 api changes")
def test_function():
...
raises参数
如果你想更具体地说明测试失败的原因,可以在raises参数中指定单个异常或异常元组。
@pytest.mark.xfail(raises=RuntimeError)
def test_function():
...
然后,如果测试失败并且没有提到的例外,那么测试将被报告为常规失败raises。
run参数
如果测试应标记为xfail并且如此报告但不应该执行,请使用以下run参数False:
@pytest.mark.xfail(run=False)
def test_function():
...
这对于崩溃解释器的xfailing测试特别有用,应该稍后进行调查。
忽略xfail
通过在命令行上指定:
pytest --runxfail
你可以强制运行并报告xfail标记的测试,就像它根本没有标记一样。这也导致pytest.xfail没有效果。
示例
这是一个简单的测试文件,有几个用法:
import pytest
xfail = pytest.mark.xfail
@xfail
def test_hello():
assert 0
@xfail(run=False)
def test_hello2():
assert 0
@xfail("hasattr(os, 'sep')")
def test_hello3():
assert 0
@xfail(reason="bug 110")
def test_hello4():
assert 0
@xfail('pytest.__version__[0] != "17"')
def test_hello5():
assert 0
def test_hello6():
pytest.xfail("reason")
@xfail(raises=IndexError)
def test_hello7():
x = []
x[1] = 1
使用report-on-xfail选项运行它会提供以下输出:
example $ pytest -rx xfail_demo.py
=========================== test session starts ============================
platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y
cachedir: $PYTHON_PREFIX/.pytest_cache
rootdir: $REGENDOC_TMPDIR/example
collected 7 items
xfail_demo.py xxxxxxx [100%]
========================= short test summary info ==========================
XFAIL xfail_demo.py::test_hello
XFAIL xfail_demo.py::test_hello2
reason: [NOTRUN]
XFAIL xfail_demo.py::test_hello3
condition: hasattr(os, 'sep')
XFAIL xfail_demo.py::test_hello4
bug 110
XFAIL xfail_demo.py::test_hello5
condition: pytest.__version__[0] != "17"
XFAIL xfail_demo.py::test_hello6
reason: reason
XFAIL xfail_demo.py::test_hello7
======================== 7 xfailed in 0.12 seconds =========================
跳过/ xfail与参数多态
使用参数化时,可以将skip和xfail等标记应用于各个测试实例:
import pytest
@pytest.mark.parametrize(
("n", "expected"),
[
(1, 2),
pytest.param(1, 0, marks=pytest.mark.xfail),
pytest.param(1, 3, marks=pytest.mark.xfail(reason="some bug")),
(2, 3),
(3, 4),
(4, 5),
pytest.param(
10, 11, marks=pytest.mark.skipif(sys.version_info >= (3, 0), reason="py2k")
),
],
)
def test_increment(n, expected):
assert n + 1 == expected```
python考试pass or fail_Pytest官方教程-12-skip及xfail: 处理不能成功的测试用例相关推荐
- python考试pass or fail_请问老师为什么我输入的数据,预期结果是pass,我的预期因该是“fail”...
#coding = utf-8 import sys sys.path.append('C:\Users\15927\Documents\SELENIUMPYTHONBASE') from util. ...
- python考试pass or fail_python-pytest学习(十二)-标记失败xfail
一.前言 当用例a失败的时候,如果用例b和用例c都是依赖于第一个用例的结果,那可以直接跳过用例b和c的测试,直接给他标记失败xfail 用到的场景,登录是第一个用例,登录之后的操作b是第二个用例,登录 ...
- 【caffe】Caffe的Python接口-官方教程-01-learning-Lenet-详细说明(含代码)
01-learning-Lenet, 主要讲的是 如何用python写一个Lenet,以及用来对手写体数据进行分类(Mnist).从此教程可以知道如何用python写prototxt,知道如何单步训练 ...
- python编写opencv-OpenCV官方教程中文版(for Python)pdf+自己编写的全套目录
[实例简介] OpenCV官方教程中文翻译版,python语言,自做完整书签方便查找阅读 内容详细,是学OpenCV的必备教程 书虽然挺好的,但是不够全面,不能让读者完全了解 opencv的现状).而 ...
- labview python opencv_OpenCV官方教程中文版(for Python)pdf+自己编写的全套目录
[实例简介] OpenCV官方教程中文翻译版,python语言,自做完整书签方便查找阅读 内容详细,是学OpenCV的必备教程 书虽然挺好的,但是不够全面,不能让读者完全了解 opencv的现状).而 ...
- 如何在Windows上做Python开发?微软出了官方教程(附链接)
来源:机器之心 本文附教程,建议阅读5分钟. 本文为你分享微软最近发布的关于在Windows上做Python开发的一系列官方教程. 在Windows上做Python开发太痛苦?微软最近发布了一系列官方 ...
- 微软官方教程教你如何在Windows上做Python开发?
关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 教程地址:https://docs.microsoft.com/zh-cn/win ...
- Caffe官方教程翻译(9):Multilabel Classification with Python Data Layer
前言 最近打算重新跟着官方教程学习一下caffe,顺便也自己翻译了一下官方的文档.自己也做了一些标注,都用斜体标记出来了.中间可能额外还加了自己遇到的问题或是运行结果之类的.欢迎交流指正,拒绝喷子! ...
- python中文语法提示_Python官方中文文档上线了:各种教程已汉化,不用再苦等野生翻译...
终于,Python有官方中文文档了. 从今往后,不论是版本新变化,入门教程,语法讲解,Python模块安装指南--各种各样的手册,都可以直接看中文了. △ 不是谷歌翻译哟 你看,比起英文原版,中文的语 ...
最新文章
- nc361t支持的服务器,Windows Server 2008 R2通过IP安全策略阻止某个IP
- 如果当初学习编程时能有人给我这些忠告该多好
- MySQL—函数的使用
- C++使用数组的链表实现(附完整源码)
- CVS Branch 和 Merge 在 Eclipse 中的使用
- CRM WebClient UI页面的跳转处理
- linux 命令行 解密,解密Linux终端命令 学好Linux
- 减治法在查找算法中的应用(JAVA)--折半查找
- 反射 getDeclaredMethod和getMethod的区别以及用法《实例》
- SenchaTouch中出现数据覆盖 以及 “Cannot call method 'setData' of nul”l错误的可能原因
- 为制造业构建Teams Power App 3:创建制造商UI
- java内部类为什么使用很少_Java内部类你真的会吗?
- ECSHOP集成百度ueditor编辑器上传图片到服务器或又拍云(七牛云)
- .net core EF Core 调用存储过程
- 常用日期格式符(表格)
- 为什么全局钩子必须写到dll里面?
- android圆形头像边框,利用Android中BitmapShader制作自带边框的圆形头像
- Windows去快捷方式角标
- 最小二乘法入门(Matlab直线和曲线拟合)
- 红警ol服务器维护,红警OL基地升级条件汇总 腾讯红警OL手游基地升级表
热门文章
- 【算法】栈实现综合表达式计算
- 【Flink】Flink Invalid timestamp -1 Timestamp should always be none-negative or null
- 【Clickhouse】Clickhouse 表引擎之 Log系列
- 【Docker】elasticsearch 监控工具 elasticsearch-HQ Unable to create connection to: http://localhost:9200
- 60-100-340-使用-DataSource-hive相关-Flink加载hive数据源
- scala学习-scala读取Hbase表中数据并且做join连接查询
- 看了这个有趣的例子,你就能秒懂Java中的多线程同步了!
- win7计算机双击空白,win7系统控制面板“打开或关闭Windows 功能”空白没有任何选项的解决方法...
- 我们不生产代码,我们只是代码的搬运工
- Java并发编程-synchronized锁优化