试图了解参数化测试的 pytest-xdist 失败

Trying to understand pytest-xdist failures for parametrized tests

我有一些参数化测试使用了在 conftest 中定义的夹具。当使用 pytest-xdist 但通过标准 pytest 时,我的测试失败了。夹具创建一个目录,然后由测试使用,我收到 IOErrors。

从输出来看,两个失败的参数化测试似乎被收集 and/or 多次 运行。请注意,在下面的输出中 test_save_load[obj2] 和 test_save_load[obj0] 失败并且它们出现了两次,所以我假设它们被 运行 多次。我可以用不同的方式编写测试,而不是参数化;但很想了解这个问题。非常感谢任何关于正在发生的事情或 pytest-xdist 如何帮助理解问题的想法。

谢谢!

这是我的输出片段:

platform darwin -- Python 2.7.6 -- pytest-2.5.1 -- 
plugins: xdist
[gw0] darwin Python 2.7.6 cwd: /tests/unit_tests
[gw1] darwin Python 2.7.6 cwd: /tests/unit_tests
[gw2] darwin Python 2.7.6 cwd: /tests/unit_tests
[gw3] darwin Python 2.7.6 cwd: /tests/unit_tests
[gw0] Python 2.7.6 (v2.7.6:3a1db0d2747e, Nov 10 2013, 00:42:54)  -- [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]
[gw2] Python 2.7.6 (v2.7.6:3a1db0d2747e, Nov 10 2013, 00:42:54)  -- [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]
[gw1] Python 2.7.6 (v2.7.6:3a1db0d2747e, Nov 10 2013, 00:42:54)  -- [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]
[gw3] Python 2.7.6 (v2.7.6:3a1db0d2747e, Nov 10 2013, 00:42:54)  -- [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]
gw0 [30] / gw1 [30] / gw2 [30] / gw3 [30]
scheduling tests via LoadScheduling

test_save_load.py:17: test_exceptions 
test_save_load.py:135: test_save_load[obj0] 
test_save_load.py:45: test_gnome_obj_reference 
test_save_load.py:135: test_save_load[obj2] 
[gw3] PASSED test_save_load.py:17: test_exceptions 
[gw1] PASSED test_save_load.py:45: test_gnome_obj_reference 
test_save_load.py:31: test_reference_object 
[gw3] PASSED test_save_load.py:31: test_reference_object 
test_save_load.py:73: test_savloc_created 
test_save_load.py:135: test_save_load[obj4] 
[gw1] PASSED test_save_load.py:73: test_savloc_created 
test_save_load.py:135: test_save_load[obj5] 
[gw3] PASSED test_save_load.py:135: test_save_load[obj4] 
test_save_load.py:135: test_save_load[obj6] 
[gw2] FAILED test_save_load.py:135: test_save_load[obj2] 
[gw0] FAILED test_save_load.py:135: test_save_load[obj0] 

xdist 输出与标准的 pytest 略有不同,因为测试是 运行 并行进行的。当您看到:

test_save_load.py:135: test_save_load[obj0]

表示测试已经发送到其中一个节点执行。

当你看到:

[gw0] FAILED test_save_load.py:135: test_save_load[obj0] 

只是表示测试在节点0.

完成

也就是说,您的测试只执行了一次。您对测试失败的描述似乎表明测试正在共享一些磁盘资源(例如,它们都试图写入相同的文件名)。

您应该确保处理文件的测试在单独的目录中运行,以便每个测试都与其他测试完全隔离;您可以在 tmpdir 夹具的帮助下完成此操作。

如果你 post 更多关于测试自己的信息,也许人们可以给出更具体的建议。

干杯,