目录:
- 安装及入门
- 使用和调用方法
- 原有TestSuite使用方法
- 断言的编写和报告
- Pytest fixtures:清晰 模块化 易扩展
- 使用Marks标记测试用例
- Monkeypatching/对模块和环境进行Mock
- 使用tmp目录和文件
- 捕获stdout及stderr输出
- 捕获警告信息
- 模块及测试文件中集成doctest测试
- skip及xfail: 处理不能成功的测试用例
- Fixture方法及测试用例的参数化
- 缓存: 使用跨执行状态
- unittest.TestCase支持
- 运行Nose用例
- 经典xUnit风格的setup/teardown
- 安装和使用插件
- 插件编写
- 编写钩子(hook)方法
- 运行日志
- API参考
- 优质集成实践
- 片状测试
- Pytest导入机制及sys.path/PYTHONPATH
- 配置选项
- 示例及自定义技巧
- Bash自动补全设置
片状”测试是表现出间歇性或偶发性失败的测试,似乎具有非确定性行为。有时它会通过,有时会失败,而且不清楚为什么。本页讨论了可以提供帮助的pytest功能以及识别,修复或减轻它们的其他一般策略。
为什么片状测试是个问题
当使用连续集成(CI)服务器时,片状测试尤其麻烦,因此在合并新代码更改之前必须通过所有测试。如果测试结果不是一个可靠的信号 - 测试失败意味着代码更改破坏了测试 - 开发人员可能会对测试结果产生不信任,这可能导致忽略真正的失败。它也是浪费时间的一个来源,因为开发人员必须重新运行测试套件并调查虚假故障。
潜在的根本原因
系统状态
从广义上讲,一个片状测试表明测试依赖于一些未被适当控制的系统状态 - 测试环境没有充分隔离。更高级别的测试更有可能是因为他们依赖更多的状态。
当测试套件并行运行时(例如使用pytest-xdist),有时会出现片状测试。这可以表明测试依赖于测试排序。
- 也许不同的测试是在自身之后无法清理并留下导致片状测试失败的数据。
- 片状测试依赖于先前测试的数据,该测试不会自行清理,并且并行运行以前的测试并不总是存在
- 修改全局状态的测试通常不能并行运行。
过于严格的断言
过于严格的断言可能会导致浮点比较以及时序问题。pytest.approx在这里很有用。
Pytest功能
Xfail严格
pytest.mark.xfail withstrict=False
可用于标记测试,以便其失败不会导致整个构建中断。这可以被视为手动隔离,永久使用是相当危险的。
PYTEST_CURRENT_TEST
PYTEST_CURRENT_TEST环境变量可用于确定“哪个测试卡住了”。
插件
重新运行任何失败的测试可以通过给予他们额外的机会来减轻片状测试的负面影响,这样整体构建就不会失败。几个pytest插件支持这个:
- 片状
- pytest-flakefinder - 博客文章
- pytest-rerunfailures
- pytest-replay:这个插件有助于重现CI运行期间观察到的局部崩溃或片状测试。
故意随机化测试的插件可以帮助公开测试状态问题:
其他一般策略
拆分测试套件
将单个测试套件拆分为两个是常见的,例如单元与集成,并且仅将单元测试套件用作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
资源
- 在马丁福勒,2011年消除测试中的非决定论
- 2012年,Pavan Sudarshan 对Go团队的测试没有更多
- 破碎的建筑:在持续集成测试中建立信任测试由Angie Jones在2017年奥斯汀SeleniumConf上讲话(视频)
- 测试和代码播客:片状测试以及如何处理它们由Brian Okken和Anthony Shaw,2018年
- 微软:
- 我们如何通过测试VSTS来实现 2017年Brian Harry MS的持续交付
- 2017年,Munil Shah 消除了Flaky Tests的博客和谈话(视频)
- 谷歌:
- 谷歌的片状测试和我们如何减轻他们的影响,约翰米科,2016年
- 谷歌的片状测试来自哪里? 作者:Jeff Listfield,2017
网友评论