pytest run并行测试

时间:2017-08-17 11:21:10

标签: python pytest

我希望并行运行所有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?

4 个答案:

答案 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的方法对我有用。