Pytest学习笔记(22)-分布式执行pytest-xdist插件

  • Post author:
  • Post category:其他




前言

  • 在日常功能测试用例非常多时,比如有1千条用例,假设每个用例执行需要1分钟,如果单个测试人员执行需要1000分钟才能跑完
  • 当项目非常紧急时,会需要协调多个测试资源来把任务分成两部分,于是执行时间缩短一半,如果有10个小伙伴,那么执行时间就会变成十分之一,大大节省了测试时间
  • 为了节省项目测试时间,10个测试同时并行测试,这就是分布式执行
  • 同样道理,当我们自动化测试用例非常多的时候, 一条条按顺序执行会非常慢,

    pytest-xdist的出现就是为了让自动化测试用例可以分布式执行,从而大大节省自动化测试执行的时间

  • pytest-xdist是属于进程级别的并发



分布式执行用例的设计原则(重点)

当然自动化测试用例要想能够分布式执行,还是要满足一些条件的:


  • 用例之间相互独立

    :保证用例之间没有依赖关系,用例可以完全独立运行

  • 用例没有执行顺序

    :保证随机顺序的执行用例都可正常执行

  • 用例之间互不影响

    :保证用例的运行结果不会影响到其他用例



插件介绍

  • 目前支持Python的 v3.6 – 3.10 版本哦

  • 官方文档地址:https://pypi.org/project/pytest-xdist/



特性(官方解释)

  • 测试运行

    并行化

    :测试可以跨多个 CPU 或主机执行。这允许加速开发或使用

    远程机器

    的特殊资源。


  • --looponfail

    :在子进程中重复运行测试。每次运行后,pytest 都会等待项目中的文件发生更改,然后重新运行之前失败的测试。重复此过程,直到所有测试都通过,然后再次执行完整运行。


  • 多平台

    覆盖:您可以指定不同的 Python 解释器或不同的平台,并在所有平台上并行运行测试。

    在远程运行测试之前,

    pytest

    有效地将您的程序源代码“同步”到远程位置。您可以指定不同的 Python 版本和解释器。但是,它不会安装/同步依赖项。


    注意

    :这种模式的存在主要是为了向后兼容,因为现代开发依赖于多平台测试的持续集成。



插件安装

pip install pytest-xdist -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eiympqJq-1646038268207)(C:\Users\nowcoder\AppData\Roaming\Typora\typora-user-images\image-20220228151011102.png)]



快速入门



项目结构
在这里插入图片描述



相关代码



test_xdist.conftest.py
import pytest


@pytest.fixture(scope="session")
def pwd_login():
    print("== 开始用例 ==")
    name, pwd = "admin", "123456"
    yield name, pwd
    print("== 退出用例 ==")


test_xdist.test_01.py
from time import sleep

import pytest


@pytest.mark.parametrize("x", list(range(10)))
def test_index(pwd_login, x):
    sleep(1)
    print("首页用例", x)


test_xdist.test_module1.test_case1.py
from time import sleep

import pytest


@pytest.mark.parametrize("x", list(range(10)))
def test_func1(x):
    sleep(1)
    print("module1 测试用例-1",x)


test_xdist.test_module2.test_case2.py
from time import sleep

import pytest


@pytest.mark.parametrize("x", list(range(10)))
def test_func1(x):
    sleep(1)
    print("module2 测试用例-2", x)


test_xdist.test_module3.test_case3.py
from time import sleep


def test_func3():
    sleep(1)
    print("module3 测试用例-3")



不使用分布式执行
在这里插入图片描述

可以看到,每条用例sleep(1),一共31条用例,总共运行了31.44s



使用分布式执行

在这里插入图片描述

运行前cpu占用情况
在这里插入图片描述

运行中cpu占用情况

在这里插入图片描述



知识点

  • 可以看到,最终运行时间只需要6s,我的电脑是真6核,假12核
  • -n auto:可以自动检测到系统的CPU核数;从测试结果来看,检测到的是逻辑处理器的数量,即假12核
  • 使用auto等于利用了所有CPU来跑用例,此时CPU占用率会特别高



拓展:指定执行用例CPU个数

要将测试发送到多个 CPU,请使用

-n

(或

--numprocesses

)选项

# 使用 -n 指定两个cpu 来运行用例
pytest -s -n 2
# 使用 --numprocesses 指定两个cpu 来运行用例
pytest -s -n 2

在这里插入图片描述

传递

-n auto

以使用与您的计算机具有 CPU 内核一样多的进程。这可能会导致相当大的速度提升,尤其是在您的测试套件需要大量时间的情况下



拓展:pytest-xdist指定用例运行顺序

xdist插件,支持使用

--dist

命令行选项控制用例的执行顺序



语法

pytest --dist [option]

# 或者使用 =
pytest --dist=[option]



知识点


  • --dist load


    (默认)

    : 将挂起的测试发送给任何可用的工作人员,没有任何保证的顺序


  • --dist loadscope

    :测试按

    模块

    分组,用于

    测试功能

    ,按



    分组,用于

    测试方法

    。组作为一个整体分配给可用的工人。

    这保证了一个组中的所有测试都在同一个进程中运行

    。如果您有昂贵的模块级或类级设备,这将很有用。按类分组优先于按模块分组


  • --dist loadfile

    :测试按其包含的文件分组。组作为一个整体分配给可用的工人。

    这保证了一个文件中的所有测试都在同一个工作人员中运行


  • --dist loadgroup

    :测试按

    xdist_group

    标记分组。组作为一个整体分配给可用的工人。

    这保证了所有具有相同

    xdist_group

    名称的测试都在同一个 worker 中运行


  • --dist no

    :正常的 pytest 执行模式,一次运行一个测试(根本没有分发)



举个🌰

@pytest.mark.xdist_group(name="group1")
def test1():
    pass

class TestA:
    @pytest.mark.xdist_group("group1")
    def test2():
        pass

这将确保

test1



TestA::test2

将在同一个 worker 中运行。没有

xdist_group

标记的测试像

--dist=load

模式一样正常分发执行



版权声明:本文为qq_42841075原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。