Python:同时运行顺序和并行测试



我最近扩展了python模块的一个函数的范围,使其可以顺序或并行执行(使用mpi4py(。

def foo(param, use_mpi=False):
pass

当我手动运行测试时,它起作用:

# (1) Sequentially
>>> python my_test_seq.py
# (2) In parallel
>>> mpirun -n 3 my_test_par.py

到目前为止,我一直在使用pytest,一切都很好,直到我想添加并行测试。事实上,我找不到用几个过程启动并行测试(2(的方法。我唯一能做的就是并行运行几个pytest(因此一个测试运行多次(,但这不能满足我的需求。。。

有人知道怎么做吗?

我找到了两种可能的方法:

  1. 使用pytest mpi,当pytest在mpi下运行时,它可以帮助您运行测试,例如$ mpirun -n 2 python -m pytest --with-mpi。它提供了简单的标记来跳过不应该使用mpi运行的测试,或者应该有运行所需的最小进程数
  2. 使用pytest_easyMPI,这个包旨在使MPI代码测试尽可能类似于测试常规串行代码。使用如下装饰器可以在同一个文件中混合串行和并行代码(使用4个MPI列运行(:
def foo_serial():
pass
@mpi_parallel(4)
def foo_parallel():
pass

用于启动我的测试的命令是pytest --pyargs my_package

我将使用pytest_easyMPI,因为它允许我透明地运行串行和并行测试。此外,它似乎与pytest xdist兼容!如果我有负面反馈,我会修改或添加评论到我的回答中。

import pytest
import time
@pytest.mark.xdist_group(name="group1")
def test_case1():
time.sleep(5)
print("Parallel Test Case 1")
@pytest.mark.xdist_group(name="group1")
def test_case2():
time.sleep(5)
print("Parallel Test Case 2")
@pytest.mark.xdist_group(name="group1")
def test_case3():
time.sleep(5)
print("Parallel Test Case 3")
@pytest.mark.xdist_group(name="group1")
@pytest.mark.smoke
def test_case4():
time.sleep(5)
print("Parallel Test Case 4")
@pytest.mark.xdist_group(name="group1")
@pytest.mark.smoke
def test_case5():
time.sleep(5)
print("Parallel Test Case 5")
@pytest.mark.xdist_group(name="group2")
@pytest.mark.smoke
def test_case6():
time.sleep(5)
print("Parallel Test Case 6")
@pytest.mark.xdist_group(name="group2")
def test_case7():
time.sleep(5)
print("Parallel Test Case 7")
@pytest.mark.xdist_group(name="group2")
def test_case8():
time.sleep(5)
print("Parallel Test Case 8")
@pytest.mark.xdist_group(name="group2")
def test_case9():
time.sleep(5)
print("Parallel Test Case 9")
@pytest.mark.xdist_group(name="group2")
def test_case10():
time.sleep(5)
print("Parallel Test Case 10")

现在使用--dist loadgroup运行测试

pytest --html=report.html -n auto --dist loadgroup -m smoke

我们可以看到,组1中的测试是按顺序运行的,组2中的测试是以顺序但并行的方式运行的。

如果我们不标记组,所有测试将在不同的工作者中并行运行。

最新更新