在我的场景中,我有一个写入文件的测试,以及一个(但可能更多(想要读取该文件的测试。我不能简单地提取将该文件写入函数/夹具,因为它涉及一些其他夹具,这些夹具内部正在启动其他二进制文件以及写入该文件的二进制文件。所以我有一个固定装置,可以检查文件是否已经存在。
到目前为止我尝试过:
- 片状和 pytest-rerunfailure 插件 - 不合适,因为它们都在失败时立即重新运行测试(当文件仍然存在时(,我想将其附加到测试队列的末尾。
- 手动修改测试队列,如下所示:
。
request.session.items.append(request.node)
pytest.xfail("file not present yet")
这种工作,但只有当我在单个流道上运行时(没有 xdist,或者通过传递 CLI 参数-n0
打开它, 在我的测试报告中,我看到这样的东西:
test_load_file_before_save xfail
test_save_file PASSED
test_load_file PASSED
test_load_file_before_save PASSED
使用 XDIST 运行时,不会重复 XFond 测试。有人知道如何进行吗?强制xdist刷新测试列表的某种方法?
您可以使用 pytest.cache 获取测试运行状态,并在失败时将该测试追加到队列中。
if request.config.cache.get(request.node):
request.session.items.append(request.node)
pytest.xfail("file not present yet")
您还可以在 pytest 缓存中设置自定义值,以便在具有request.config.cache.set(data,val)
的不同运行中使用。
如果你正在编写一个在测试目录中的文件,你可以使用 pytest-xdist 的--looponfail
开关。它监视目录并重新运行测试,直到测试通过。 从文档:distributed and subprocess testing:
-f, --looponfail run tests in subprocess, wait for modified files and
re-run failing test set until all pass.
可能有帮助的链接:Pytest-cache
作为一个友好的建议,如果您计划在并行线程中运行测试,我建议您使测试彼此独立。
安装软件包 pytest-rerunfailures:
pip install pytest-rerunfailures
请参阅有关如何在 pytest 中使用重新运行功能的文档。
重新运行指定的次数
若要重新运行所有测试失败,请使用
--reruns
命令行选项,其中包含您希望测试运行的最大次数:pytest --reruns 5
失败的夹具或setup_class也将重新执行。
在重新运行之间添加延迟
若要在重新运行之间添加延迟时间,请使用
--reruns-delay
命令行选项,其中包含在启动下一次测试重新运行之前要等待的秒数:pytest --reruns 5 --reruns-delay 1