我希望并行运行所有pytest
测试而不是顺序测试。
我目前的设置如下:
class Test1(OtherClass):
@pytest.mark.parametrize("activity_name", ["activity1", "activity2"])
@pytest.mark.flaky(reruns=1)
def test_1(self, activity_name, generate_test_id):
"""
"""
test_id = generate_random_test_id()
test_name = sys._getframe().f_code.co_name
result_triggers = self.proxy(test_name, generate_test_id, test_id, activity_name)
expected_items = ["response"]
validate_response("triggers", result_triggers, expected_items)
@pytest.mark.parametrize("activity_name", ["activity1", "activity2"])
@pytest.mark.flaky(reruns=1)
def test_2(self, activity_name, generate_test_id):
"""
"""
#same idea...
我使用pytest -v -s
运行测试。
结果是我的测试按顺序运行,这需要花费很多时间,因为其中一些测试等待来自远程服务器的响应(集成测试)。
有没有办法并行运行pytest?
答案 0 :(得分:22)
你想要pytest-xdist
。我认为Qxf2很好地解释了它:Qxf2 on Pytest-Xdist
他们的Linux命令行对我的口味有点过于冗长;我用:
pytest -n <NUM>
其中&lt; NUM&gt;是并行工人的数量。
答案 1 :(得分:3)
pytest-xdist
是大多数情况下的绝佳解决方案,但是集成测试非常特殊。向远程服务器发送请求后,另一个测试可以在新线程上开始,而不必等待响应。这是并发测试,而不是并行测试。并发允许一次进行更多测试,而内存和处理开销则更少。
我编写了pytest-parallel
插件[py3.6 +]以启用并行和并发测试。同时运行集成测试的方法如下:
pytest --tests-per-worker auto
答案 2 :(得分:3)
为了并行运行 pytests,您需要安装 pytest-xdist。请参阅下面列出的不同并行策略,您可以使用其中任何一种(但我可以打赌,其中一种最适合您的特定情况):
pip install pytest-xdist
# The most primitive case, sending tests to multiple CPUs:
pytest -n NUM
# Execute tests within 3 subprocesses.
pytest --dist=each --tx 3*popen//python=python3.6
# Execute tests in 3 forked subprocess. Won't work on windows.
pytest --dist=each --tx 3*popen//python=python3.6 --boxed
# Sending tests to the ssh slaves
pytest --dist=each --tx ssh=first_slave --tx ssh=seconds_slave --rsyncdir package package
# Sending tests to the socket server, link is available below.
python socketserver.py :8889 &
python socketserver.py :8890 &
pytest --dist=each --tx socket=localhost:8889 --tx socket=localhost:8890
您可以为 --dist
(-d
) 参数提供不同的值,该参数处理跨工作器分发测试的方式,有关 --dist 用法的更多信息,请参阅文档。>
注意:一旦执行测试,socket_server.py 就会关闭。我建议您从单独的终端窗口运行套接字服务器以进行调试
您可以引入更复杂的流程,例如在 docker 容器内运行测试,其中已启动套接字服务器类型的“pytest worker”和另一个与它们通信并充当“pytest runner”的 docker 容器。
答案 3 :(得分:0)
pytest-xdist对我不起作用,因为我的测试正在等待99.9999999%的时间来完成来自AWS的胶水作业,并且我使用的是具有2个核心的CodeBuild环境,因此我只能在2个内核上运行2个测试时间。
@kevelend的方法对我有用。