Pytest权威教程23-不稳定测试
不稳定测试用例处理
“不稳定”测试用例是指,有时候用例通过,有时候失败。用例间歇或偶发性出现故障,并且不清楚原因。本页讨论了pytest的一些帮助处理这些不确定测试用例的功能。这些功能可以帮助你快速确定、修复或缓解这些问题,或提供一些其他的常规策略。
为什么不稳定测试是个问题
当使用连续集成(CI)服务器时,不稳定测试尤其麻烦,因此在合并新代码更改之前必须通过所有测试。如果测试结果不是一个不稳定 - 测试失败意味着代码更改破坏了测试 - 开发人员可能会对测试结果产生不信任,这可能导致忽略真正的失败。它也是浪费时间的一个来源,因为开发人员必须重新运行测试套件并调查虚假故障。
潜在的根本原因
系统状态
从广义上讲,不稳定测试用例,表明测试依赖于一些未被适当控制的系统状态 - 测试环境没有充分隔离。更高级别的测试更有可能是因为他们依赖更多的状态。
当测试套件并行运行时(例如使用pytest-xdist),有时会出现不稳定测试用例。这可以表明测试依赖于测试顺序。
- 也许不同的测试是在自身之后无法清理并留下导致片状测试失败的数据。
- 不稳定测试依赖于先前测试的数据,该测试不会自行清理,并且并行运行以前的测试并不总是存在。
- 修改全局状态的测试通常不能并行运行。
过于严格的断言
过于严格的断言可能会导致浮点比较以及时序问题。pytest.approx在这里很有用。
Pytest特性
Xfail严格模式
pytest.mark.xfail和strict=False可用于标记测试,以便其失败不会导致整个构建中断。这一般用于临时手动隔离一些问题,但不推荐永久使用。
PYTEST_CURRENT_TEST
PYTEST_CURRENT_TEST环境变量可用于确定“哪个测试卡住了”。
插件
重新运行任何失败的用例可以通过给予他们额外的机会来减轻不稳定测试的负面影响,这样整体构建就不会失败。以下几个pytest插件可以支持用例重新运行:
- flasky
- pytest-flakefinder - blog post
- pytest-rerunfailures
- pytest-replay:这个插件有助于重现CI运行期间观察到的局部崩溃或片状测试。
使用随机化测试的插件,打乱运行顺序也可以帮助暴露测试状态依赖问题:
- pytest-reandom-order
- pytest-randomly
其他一般策略
拆分测试套件
将单个测试套件拆分为两个是常见的,例如单元与集成,并且仅将单元测试套件用作CI门。这也有助于保持构建时间的可管理性,因为高级别测试往往更慢。但是,这意味着打破构建的代码可能会合并,因此需要额外的警惕来监视集成测试结果。
失败的视频/截图
对于UI测试,这些对于了解测试失败时UI的状态非常重要。pytest-splinter可以与pytest-bdd这样的插件一起使用,并且可以在测试失败时保存屏幕截图,这有助于隔离原因。
删除或重写测试
如果其他测试涵盖了该函数,则可能会删除该测试。如果没有,也许它可以在较低的水平重写,这将消除片状或使其来源更明显。
隔离
Mark Lapierre在2018年的一篇文章中讨论了[隔离测试的优缺点。
在失败时重新运行的CI工具
Azure管道(Azure云CI / CD工具,以前称为Visual Studio Team Services或VSTS)具有[识别片状测试和重新运行失败测试的函数。
相关研究
这个列表比较简短,请提交问题或拉取请求以扩展它!
- Gao,Zebao,Yalan Liang,Myra B. Cohen,Atif M. Memon和Zhen Wang。“使系统用户交互式测试可重复:何时以及我们应该控制什么?”在软件工程(ICSE),2015 IEEE / ACM第37届IEEE国际会议上,第一卷。1,pp.55-65。IEEE,2015年PDF
- Palomba,Fabio和Andy Zaidman。“测试气味的重构是否会导致固定片状测试?”在软件维护和演进(ICSME),2017 IEEE国际会议上,第1-12页。IEEE,2017.Google[Drive中的PDF
- Bell,Jonathan,Owolabi Legunsen,Michael Hilton,Lamyaa Eloussi,Tifany Yung和Darko Marinov。“DeFlaker:自动检测片状测试。”在2018年国际软件工程会议论文集中。2018.[PDF
相关资源
- Eradicating Non-Determinism in Tests by Martin Fowler, 2011
- No more flaky tests on the Go team by Pavan Sudarshan, 2012
- The Build That Cried Broken: Building Trust in your Continuous Integration Tests talk (video) by Angie Jones at SeleniumConf Austin 2017
Test and Code Podcast: Flaky Tests and How to Deal with Them by Brian Okken and Anthony Shaw, 2018 - Microsoft:
- How we approach testing VSTS to enable continuous delivery by Brian Harry MS, 2017
- Eliminating Flaky Tests blog and talk (video) by Munil Shah, 2017
- Google:
- Flaky Tests at Google and How We Mitigate Them by John Micco, 2016
- Where do Google’s flaky tests come from? by Jeff Listfield, 2017
Pytest权威教程23-不稳定测试的更多相关文章
- Pytest权威教程11-模块及测试文件中集成doctest测试
目录 模块及测试文件中集成doctest测试 编码 使用doctest选项 输出格式 pytest-specific 特性 返回: Pytest权威教程 模块及测试文件中集成doctest测试 编码 ...
- Pytest权威教程(官方教程翻译)
Pytest权威教程01-安装及入门 Pytest权威教程02-Pytest 使用及调用方法 Pytest权威教程03-原有TestSuite的执行方法 Pytest权威教程04-断言的编写和报告 P ...
- Pytest权威教程14-缓存:使用跨执行状态
目录 缓存:使用跨执行状态 使用方法 首先只重新运行故障或故障 上次运行中没有测试失败时的行为 新的config.cache对象 检查缓存内容 清除缓存内容 逐步修复失败用例 unittest.Tes ...
- Pytest权威教程25-配置
目录 配置 命令行选项和配置文件设置 初始化:确定ROOTDIR和INIFILE 寻找rootdir 如何更改命令行选项默认值 内置的配置文件选项 返回: Pytest权威教程 配置 命令行选项和配置 ...
- Pytest权威教程24-Pytest导入机制及系统路径
目录 Pytest导入机制和sys.path/PYTHONPATH 包中的测试脚本及conftest.py文件 独立测试模块及conftest.py文件 调用通过python -m pytest调用p ...
- Pytest权威教程21-API参考-07-配置选项(Configuration Options)
目录 配置选项(Configuration Options) addopts cache_dir confcutdir console_output_style doctest_encoding do ...
- Pytest权威教程21-API参考-06-变量及异常
目录 特殊变量(Special Variables) collect_ignore collect_ignore_glob pytest_plugins pytest_mark PYTEST_DONT ...
- Pytest权威教程21-API参考-05-对象(Objects)
目录 对象(Objects) CallInfo Class Collector Config ExceptionInfo FixtureDef FSCollector Function Item Ma ...
- Pytest权威教程21-API参考-04-钩子(Hooks)
目录 钩子(Hooks) 引导时的Hook方法 初始化时的Hook方法 测试运行时的Hook方法 收集用例时的Hook方法 生成测试结果时的Hook方法 调试/交互Hook方法 返回: Pytest权 ...
随机推荐
- Mac 磁盘分区格式
Mac 磁盘分区格式 来源 https://www.chadou.me/p/190 参考文章 macOS磁盘工具帮助 在Mac系统中抹掉(格式化)磁盘的时候,要求选择分区方案,包括GUID分区图.主引 ...
- 解决SecureCRT 中文乱码??
在linux服务器上搭建solr,用的是SecureCRT 连接linux服务器,发现不能输入中文,配置文件中的中文也是乱码:先以为是SecureCRT工具编码的问题,把编码改成utf-8之后发现还 ...
- PHP 中使用ajax时一些常见错误总结整理
这篇文章主要介绍了PHP 中使用ajax时一些常见错误总结整理的相关资料,需要的朋友可以参考下 PHP作为后端时,前端js使用ajax技术进行相互信息传送时,经常会出错误,对于新手来说有些手足无措.总 ...
- ERROR: Cannot uninstall 'chardet'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.
pip 安装 docker库报错: ERROR: Cannot uninstall 'chardet'. It is a distutils installed project and thus we ...
- 导航条按钮的设置UIBarButtonItem
1.目的 2.代码 // 设置导航栏的按钮 UIButton *leftNavBtn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 35, 35 ...
- MMU与cache
这一快理解的非常浅: MMU 虚拟存储器对内存进行了逻辑上的扩充.比如一个32位的CPU系统,逻辑上的寻址可以达到4GB,但是如果直接对物理地址进行寻址,就要受到主存大小的限制. 在这种条件下,虚拟地 ...
- xadmin安装
1 安装满足django2的版本 pip3 install https://codeload.github.com/sshwsfc/xadmin/zip/django2 2 urls.py里面增加路由 ...
- RobotFramework+Eclipse的安装和配置(一)
最近想学robotframwork来做自动化,那立马就来开始上手 想动手,起码要先下载工具,工具及框架 工具介绍 Robotframework:一款自动化测试框架. Eclipse:一款编辑工具,可以 ...
- Django使用swagger生成接口文档
参考博客:Django接入Swagger,生成Swagger接口文档-操作解析 Swagger是一个规范和完整的框架,用于生成.描述.调用和可视化RESTful风格的Web服务.总体目标是使客户端和文 ...
- 如何利用AI识别未知——加入未知类(不太靠谱),检测待识别数据和已知样本数据的匹配程度(例如使用CNN降维,再用knn类似距离来实现),将问题转化为特征搜索问题而非决策问题,使用HTM算法(记忆+模式匹配预测就是智能),GAN异常检测,RBF
https://www.researchgate.net/post/How_to_determine_unknown_class_using_neural_network 里面有讨论,说是用rbf神经 ...