Skipping/excluding 测试模块 if 运行 Pytest 并行

Skipping/excluding test module if running Pytest in parallel

我有多个测试文件,比如

test_func1.py
test_func2.py
test_func3.py

我事先知道如果我运行 Pytest 并行,test_func3.py 不会通过,例如pytest -n8。原因是 test_func3.py 包含许多处理文件 i/o 进程的参数化测试。并行写入同一文件会导致失败。在串行测试模式下,该模块中的所有测试都通过。

我想知道如何跳过整个模块以防 Pytest 以选项 -n 启动?我的想法是应用 skipif 标记。我需要检查我的代码 -n 参数是否已传递给 pytest.

...>pytest # run all modules
...>pytest -n8 # skip module test_func3.py automatically

pytest-xdist包支持四种调度算法:

  • 每个
  • 加载
  • 加载范围
  • 加载文件

调用 pytest -nload 调度的快捷方式,即调度程序将负载平衡所有工作人员的测试。

使用loadfile调度,测试文件中的所有测试用例将由同一个worker顺序执行。

pytest -n8 --dist=loadfile 就可以了。缺点可能是整个测试套件的执行可能比使用 load 慢。好处是所有测试都会执行,不会跳过任何测试。

测试中可能存在影响部分服务设置的情况。 此测试不能 运行 与任何其他测试并行。

有一种方法可以像这样跳过个人测试:

@pytest.mark.unparalleled
def test_to_skip(a_fixture):
    if worker_id == "master":
        pytest.skip('Can't run in parallel with anything')

这里的第一个缺点是它会被跳过,因此您需要 运行 单独进行这些测试。为此,您可以将它们放在单独的文件夹中,或者用一些标签标记。

第二个缺点是其中使用的任何固定装置都将被初始化。