python 如何并行运行pytest测试?

zzwlnbp8  于 2023-04-04  发布在  Python
关注(0)|答案(3)|浏览(242)

我想并行运行所有的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?

nbewdwxp

nbewdwxp1#

你想要pytest-xdist。我认为Qxf 2解释得很好:Qxf2 on Pytest-Xdist
他们的Linux命令行对我来说有点太冗长了;我用途:

pytest -n <NUM>

其中是并行工作线程的数量。

pqwbnv8z

pqwbnv8z2#

更新:下面的解决方案是为了演示并发pytests是可能的,但pytest-parallel目前尚未维护。
pytest-xdist对于大多数情况来说都是一个很好的解决方案,但是集成测试是特殊的。在向远程服务器发送请求之后,另一个测试可以在新的线程上启动,而不是等待响应。这是并发测试而不是并行测试。并发允许同时进行更多的测试,而内存和处理开销要少得多。
我写了pytest-parallel插件[py3.6+]来支持并行和并发测试。下面是如何并发运行集成测试:
pytest --tests-per-worker auto

zpf6vheq

zpf6vheq3#

为了并行运行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就关闭了。建议您从单独的终端窗口运行socket server,以便进行调试

你可以引入更复杂的流程,例如在docker容器中运行测试,其中已经启动了socket服务器,类似于“pytest worker”,另一个docker容器与它们通信并充当“pytest runner”。

相关问题