5

在我的场景中,我有一个写入文件的测试,以及一个(但可能更多)想要读取该文件的测试。我不能简单地提取将该文件写入函数/夹具,因为它涉及内部正在启动其他二进制文件的一些其他夹具,以及写入该文件的二进制文件。所以我有一个夹具,可以检查文件是否已经存在。

到目前为止我尝试了什么:

  • flaky​​pytest-rerunfailures插件 - 不适合,因为它们都在失败时立即重新运行测试(当文件仍然不存在时),我想将它附加到测试队列的末尾。
  • 手动修改测试队列,如下所示:

...

request.session.items.append(request.node)
pytest.xfail("file not present yet")

这种工作,但只有当我在单跑步机上运行时(没有xdist或通过传递 cli arg 打开它-n0,在我的测试报告中我看到如下内容:

test_load_file_before_save xfail
test_save_file PASSED        
test_load_file PASSED        
test_load_file_before_save PASSED    

使用 xdist 运行时,不会重复 xfailed 测试。有人知道如何进行吗?强制 xdist 刷新测试列表的某种方式?

4

2 回答 2

2

您可以使用 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).

如果您正在编写测试目录中的文件,则可以使用--looponfailpytest-xdist 的开关。它监视目录并重新运行测试,直到测试通过。从文档: 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

作为一个友好的建议,如果您计划在并行线程中运行,我建议您使测试彼此独立。

于 2018-10-18T22:25:01.113 回答
0

安装这个包:pytest-rerunfailures 使用这个命令:pip install pytest-rerunfailures

要重新运行所有测试失败,请使用 --reruns 命令行选项以及您希望测试运行的最大次数:

$ pytest --reruns 5

失败的夹具或 setup_class 也将被重新执行。

要在重新运行之间添加延迟时间,请使用 --reruns-delay 命令行选项,其中包含您希望在启动下一次测试重新运行之前等待的秒数:

$ pytest --reruns 5 --reruns-delay 1

于 2021-06-10T07:19:21.023 回答