我最近扩展了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(因此一个测试运行多次(,但这不能满足我的需求。。。
有人知道怎么做吗?
我找到了两种可能的方法:
- 使用pytest mpi,当pytest在mpi下运行时,它可以帮助您运行测试,例如
$ mpirun -n 2 python -m pytest --with-mpi
。它提供了简单的标记来跳过不应该使用mpi运行的测试,或者应该有运行所需的最小进程数 - 使用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中的测试是以顺序但并行的方式运行的。
如果我们不标记组,所有测试将在不同的工作者中并行运行。