在我的场景中,我有一个写入文件的测试,以及一个(但可能更多)想要读取该文件的测试。我不能简单地提取将该文件写入到函数/装置中,因为它涉及到内部的一些其他装置正在启动其他一些二进制文件以及写入该文件的二进制文件。所以我有一个固定装置,可以检查文件是否已经存在。
到目前为止我尝试过的:
...
request.session.items.append(request.node)
pytest.xfail("file not present yet")
这种方法有效,但仅当我在单个跑步者上运行时(没有 xdist,或通过传递
-n0
cli arg 将其打开,
在我的测试报告中我看到这样的内容:
test_load_file_before_save xfail
test_save_file PASSED
test_load_file PASSED
test_load_file_before_save PASSED
当使用 xdist 运行时,xfailed 测试不会重复。有人知道如何继续吗?有什么方法可以强制 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
作为一个友好的建议,如果您计划在并行线程中运行测试,我建议您使测试彼此独立。
pip install pytest-rerunfailures
请参阅 docs,了解如何通过 pytest 使用重新运行功能。
要重新运行所有失败的测试,请使用
命令行选项以及您希望测试运行的最大次数:--reruns
pytest --reruns 5
失败的fixture或setup_class也会被重新执行。
要在重新运行之间添加延迟时间,请使用
命令行选项以及您希望在启动下一次测试重新运行之前等待的秒数:--reruns-delay
pytest --reruns 5 --reruns-delay 1
Xdist 为每个进程收集完整的测试集合,如果您确实想在测试运行后重新运行测试,则必须更改创建 pytest xdixt 的每个工作程序中的集合。
在说明中写得更详细。
但是如果您没有时间执行此操作,则可以使用标准 pytest --lf (--last-failed) 标志。
如何集成到 CI 中的示例:
pytest test_file.py; if [ $? -eq 0 ]; then echo "You'r message or result"; else pytest --lf test_file.py; fi