pytest教程-27-分布式执行用例插件-pytest-xdist

news2024/12/28 19:11:25

上一小节我们学习了pytest随机执行用例插件-pytest-random-order,本小节我们讲解一下pytest分布式执行用例插件pytest-xdist。

前言

平常我们手工测试用例非常多时,比如有1千条用例,假设每个用例执行需要1分钟。如果一个测试人员执行需要1000分钟才能执行完,当项目非常紧急的时候,

我们会用测试人力成本换取时间成本,这个时候多找个小伙伴把任务分成2部分,于是时间缩减一半。如果是十个人一起执行,1000个用例理论上只需100分钟就能完成,时间缩短到了1/10。大大节省的测试时间,为项目节省了时间成本。同样道理,当我们测试用例非常多的时候,一条条执行,很显然会比较慢,那么如何让测试用例并行执行呢,这就是我们接下来要讲的pytest分布式执行插件pytest-xdist。

什么是 pytest-xdist

pytest-xdist 是 pytest 测试框架的一个插件,它提供了多进程、多线程和分布式测试的支持。其中,多进程并发是其中一个引人注目的特性,它允许你同时在多个进程中运行测试用例,以加速整个测试过程。

分布式用例设计原则

  • 用例之间是独立的,用例之间没有依赖关系,用例可以完全独立运行【独立运行】
  • 用例执行没有顺序,随机顺序都能正常执行【随机执行】
  • 每个用例都能重复运行,运行结果不会影响其他用例【不影响其他用例】

安装插件

pip install pytest-xdist

基本使用

在安装了 pytest-xdist 之后,你可以在命令行中使用 -n 参数来指定并行执行的进程数。例如,如果你想要使用 4 个进程来运行测试,你可以这样做:

pytest -n 4

这将启动 4 个 worker 进程来并行执行测试。

控制执行顺序

默认情况下,pytest-xdist 是无序执行测试的。如果你需要按照一定的顺序执行测试,可以使用 --dist 参数。例如:

  • --dist=loadscope:按照模块(module)和测试类(class)来分组,确保同一个组的测试用例在同一进程中执行。
pytest -n 4 --dist=loadscope
  • --dist=loadfile:按照文件名来分组,确保同一个文件中的测试用例在同一进程中执行。
pytest -n 4 --dist=loadfile
  • --dist loadgroup: 测试按xdist_group标记分组。每组作为一个整体分配给可用的执行器。这保证了具有相同xdist_ group名称的所有测试都在同一个worker中运行。
@pytest.mark.xdist_group(name="group1")
def test1():
    pass

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

使用示例

顺序执行

import time
import pytest
def test_01():
    print('case 1')
    time.sleep(2)
    assert 1 == 1
def test_02():
    print('case 2')
    time.sleep(2)
    assert 1 == 1
def test_03():
    print('case 3')
    time.sleep(2)
    assert 1 == 1
def test_04():
    print('case 4')
    time.sleep(2)
    assert 1 == 1
def test_05():
    print('case 5')
    time.sleep(2)
    assert 1 == 1
if __name__ == '__main__':
    # 顺序执行
    pytest.main(['-s', 'test_78.py'])

325b1c526987d50659b46096f6735a8a.png

并行执行:加-n参数后面数字是并行数

import time
import pytest
def test_01():
    print('case 1')
    time.sleep(2)
    assert 1 == 1
def test_02():
    print('case 2')
    time.sleep(2)
    assert 1 == 1
def test_03():
    print('case 3')
    time.sleep(2)
    assert 1 == 1
def test_04():
    print('case 4')
    time.sleep(2)
    assert 1 == 1
def test_05():
    print('case 5')
    time.sleep(2)
    assert 1 == 1
if __name__ == '__main__':
    # 并行执行 加-n参数后面数字是并行数
    pytest.main(['-s', 'test_78.py', '-n=4', '--html=report.html', '--self-contained-html'])

3a31e0378023cc87755da865d09b9c7b.png

主从分布式测试

pytest-xdist 还支持主从(master-slave)模式,你可以在多台计算机上运行测试。首先,你需要在所有计算机上安装 pytest-xdist。然后,你可以在主机(master)上启动测试,同时在从机(workers)上启动监听。

主机(Master)配置

在主机上,创建一个配置文件(例如 pytest.ini),并设置以下参数:

[pytest]
addopts = -n auto

然后,在主机上运行以下命令:

pytest --dist=loadscope

从机(Worker)配置

在每台从机上,运行以下命令来启动监听:

pytest --dist=loadscope

这将使从机准备好接收来自主机的测试任务。

示例项目结构

假设你有一个名为 MyPytestDemo 的项目,其结构如下:

MyPytestDemo/
|-- conftest.py
|-- test_module1.py
|-- test_module2.py

在 conftest.py 中,你可以定义 fixtures:

# conftest.py
import pytest

@pytest.fixture(scope="session")
def setup():
    # 设置测试
    yield
    # 清理测试

在 test_module1.py 和 test_module2.py 中,你可以编写测试用例:

# test_module1.py
import pytest

def test_example1(setup):
    # 测试逻辑

    def test_example2(setup):
# 测试逻辑

运行分布式测试

在主机上运行分布式测试:

pytest --dist=loadscope -n auto MyPytestDemo/

这将在所有安装了 pytest-xdist 的计算机上并行执行测试。

cf67903e74b5404db5f6899add7c903a.jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1630044.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Bert基础(十八)--Bert实战:NER命名实体识别

1、命名实体识别介绍 1.1 简介 命名实体识别(NER)是自然语言处理(NLP)中的一项关键技术,它的目标是从文本中识别出具有特定意义或指代性强的实体,并对这些实体进行分类。这些实体通常包括人名、地名、组织…

【Linux】make 和 makefile

进度条 #pragma once#include <stdio.h>#define NUM 102 #define BODY #define TOP 100 #define RIGHT >extern void processbar(int rate);#include "processBar.h" #include <string.h> #include <unistd.h>const char lable[] "|/-\…

排序试题解析(二)

8.4.3 01.在以下排序算法中&#xff0c;每次从未排序的记录中选取最小关键字的记录&#xff0c;加入已排序记录的 末尾&#xff0c;该排序算法是( A ). A.简单选择排序 B.冒泡排序 C.堆排序 D.直接插入排序 02&#xff0e;简单选择排序算法的比较次数和移动次数分别为( C )。…

苹果可能将OpenAI技术集成至iOS/iPadOS 18

&#x1f989; AI新闻 &#x1f680; 苹果可能将OpenAI技术集成至iOS/iPadOS 18 摘要&#xff1a;苹果正在与OpenAI就将GPT技术部署在iOS/iPadOS 18中进行谈判。这项技术被视为可能增强的Siri功能&#xff0c;即“AI聊天机器人”。除Siri外&#xff0c;新技术还可能改善Spotl…

RFC 6071: IP Security (IPsec) and Internet Key Exchange (IKE) Document Roadmap

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/96882d1fb67b4383bc77c4dd421f7b

LeetCode 面试题 17.08 —— 马戏团人塔

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 首先&#xff0c;我们对人的身高按照从小到大排序&#xff0c;特别注意&#xff0c;对于身高相等的人&#xff0c;要按照体重从高到低排序。这时候&#xff0c;序列已经满足了在上面的人要比下面的人矮一点&#…

Blender面操作

1.细分Subdivide -选择一个面 -右键&#xff0c;细分 -微调&#xff0c;设置切割次数 2.删除 -选择一个或多个面&#xff0c;按X键 -选择要删除的是面&#xff0c;线还是点 3.挤出面Extrude -选择一个面 -Extrude工具 -拖拽手柄&#xff0c;向外挤出 -微调&#xff…

【Linux】基础指令

文章目录 基础指令1. pwd 指令2. cd 指令3. ls 指令4. touch 指令5. mkdir 指令6. rmdir 和 rm 指令7. man 指令8. cp 指令9. mv 指令10. cat 指令11. more 和 less 指令12. head 和 tail 指令13. date 指令14. cal 指令15. find 指令16. grep 指令18. zip 和 unzip 指令19. ta…

科学高效备考AMC8和AMC10竞赛,吃透2000-2024年1850道真题和解析

多做真题&#xff0c;吃透真题和背后的知识点是备考AMC8、AMC10有效的方法之一&#xff0c;通过做真题&#xff0c;可以帮助孩子找到真实竞赛的感觉&#xff0c;而且更加贴近比赛的内容&#xff0c;可以通过真题查漏补缺&#xff0c;更有针对性的补齐知识的短板。 AMC8和AMC10…

元宇宙中的DAPP:你了解多少?

元宇宙是什么&#xff1f;这是一个在当今科技圈炙手可热的话题。而在元宇宙中&#xff0c;DAPP起着至关重要的角色&#xff0c;它作为连接现实世界与虚拟世界的桥梁&#xff0c;为未来的数字世界开启了一个全新的篇章。 一、元宇宙&#xff1a;一个虚拟的数字世界 元宇宙是一…

振弦采集仪在岩土工程监测中的误差分析及提高措施探讨振弦

振弦采集仪在岩土工程监测中的误差分析及提高措施探讨 振弦采集仪是岩土工程监测中常用的一种测量设备&#xff0c;广泛应用于地基沉降、岩土体固结、地下水位变化等监测工作中。然而&#xff0c;在实际应用中&#xff0c;振弦采集仪可能存在一些误差&#xff0c;影响监测结果…

vue学习的预备知识为学好vue打好基础

目录 Vue是什么 &#xff1f;如何使用Vue &#xff1f;Vue ApiVue入口apiVue实例apiVue函数api 无构建过程的渐进式增强静态HTMLVue模块化构建工具npmyarnWebpackvue-cliVite Vue是什么 &#xff1f; 文章基于Vue3叙述。 Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于…

基于Springboot的考研资讯平台

基于SpringbootVue的考研资讯平台的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页 考研资讯 报考指南 资料信息 论坛信息 后台登录 考研资讯管理 学生管理 资…

将静态资源解析成组件使用的库

vite版本的vite-plugin-svgr vite-plugin-svgr - npm 使用

实现SpringMVC底层机制(三)

文章目录 1.封装请求数据1.将方法的httpservletrequest和httpservletresponse参数封装到参数数组进行反射调用1.修改SunDispatcherServlet.java的executeDispatch方法2.debug测试 2.封装http请求参数1.需求分析2.自定义注解RequestsParam3.修改MonsterService接口&#xff0c;添…

Python PyTorch 获取 MNIST 数据

Python PyTorch 获取 MNIST 数据 1 PyTorch 获取 MNIST 数据2 PyTorch 保存 MNIST 数据3 PyTorch 显示 MNIST 数据 1 PyTorch 获取 MNIST 数据 import torch import numpy as np import matplotlib.pyplot as plt # type: ignore from torchvision import datasets, transform…

Rust 实战练习 - 12. Axum Web 简单demo

Rust Web 历程 Rust 的异步框架tokio非他莫属&#xff0c;而web框架一直是悬而未决&#xff0c;说到底还是因为没有官方成熟的方案指引&#xff0c;大家各玩各的&#xff0c;互不兼容&#xff0c;白白浪费精力。 这个事情一直等到半官方组织tokio推出axum有了改善。但是市场上…

【神经网络结构可视化】PlotNeuralNet的安装、测试及创建自己的神经网络结构可视化图形

文章目录 前提准备1、下载MikTeX2、下载Git bash3、下载PlotNeuralNet 进行测试1、解压PlotNeuralNet-master.zip2、打开Git bash3、 在my_project中查看生成的pdf文件 创建自己的神经网络结构可视化图形 前提准备 1、下载MikTeX 下载链接&#xff1a; MikTeX ( https://mikt…

RestfulApi RestTemplate代码规范介绍

1.介绍 1.1 RestfulApi Restful API 是一种设计风格&#xff0c;代表了使用 HTTP 协议构建 web 服务的一种架构原则。REST&#xff08;Representational State Transfer&#xff09;的核心思想是&#xff0c;通过 URL 定位资源&#xff0c;使用 HTTP 方法&#xff08;GET, POS…

【多维动态规划】Leetcode 62. 不同路径【中等】

不同路径 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&#xff1…