概要

本文主要介绍了如何在测试资源(被测对象)受限的情况下,使用 pytest 进行并发测试以减少总体测试时间的方法和过程。

背景

在软件开发过程中,我们通常使用测试用例来持续保证软件的质量(例如,确保关键功能不被破坏,确保相关流程不会阻塞等)。从 CI/CD 的概念出发,要做到持续地保证软件质量,我们需要不间断地跑相关测试用例(例如,merge PR 之前、每日测试等),以保证软件持续处于高质量水平。

在这个过程中,随着总体代码量和功能的增加,我们的用例集也会不断膨胀。然而,当我们的测试集数量达到一个较大的数量时,跑一次完整的测试用例集会到达一个很恐怖的时间(例如,笔者所在的项目当前跑一遍完整测试用例的时间需要超过 3 天)。此时,将其嵌入流水线过程将变成一个不可接受的事情,利用其持续保证版本质量更是无从说起。

因此,在总体测试时间超过一个区间后,我们应当自然而然地会产生优化执行时间的想法,例如优化用例,减少大用例的执行时间等。我们这里主要介绍的是使用并发的方法减少总耗时——一般来说,这也是最立竿见影的方法。

在一般的软件测试项目中,被测应用程序(AUT, Application Under Test)一般不是测试的并发瓶颈。

例如,在 web 项目中,测试过程一般如下:

  1. 起一个 AUT(包括该 web 项目相关的数据库、后端等)
  2. 通过 http request、browser driver 等方式,访问 web 服务对应的端口并进行测试
  3. 所有测试完成后,关闭 AUT

注意到,在这个过程中,AUT 本身是支持并发的(毕竟你可不想你的网站只有一个用户可以访问),且其运行环境一般支持较高的并发访问需求。因此其进行整体测试的时间开销主要体现在固有开销上(例如,网络往返时间、io 时间、等待同步等),而不是受限于 AUT。

因此,如果你的开发场景如上,你可以肆无忌惮地并发进行测试——在搜索引擎上搜索 pytest-xdist 一般能让你很轻易地解决你的问题。然而,对于一些不幸的人,测试资源会比较受限,因此无法简单地使用通用方法解决问题。比如笔者就需要在这个场景下寻找一个解决方案。

笔者正在为一个测试框架做开发工作,其相关测试用例集主要遵循以下规则进行测试:

  1. 通过 netconf、ssh 或 http 等协议连接到待测设备(DUT, device under test)
  2. 通过不同协议的连接,对设备进行一系列表更并进行验证
  3. 测试完成后,继续测试下一个用例

在此场景中,DUT 是一台性能极其低下的网络设备(可以理解为路由器),修改其相关配置会限制影响流量的表现。因此,无论是从性能还是从功能上,该设备都不支持并发测试。

怎么办?加机器!既然一台机器无法支撑并发测试,那再加几台机器,将测试用例散列到各设备上不就行了?下面我们将进行进一步探索,总结出一个具体可行的方案。

解决方案

为了充分利用 pytest 生态,我们使用 pytest-xdist 实现并发功能,其相比于 pytest-parallel 对于 pytest-html allure-pytest 等周边生态的兼容性更好。已知 pytest-xdist 使用了多进程实现的并发操作,因此我们接下来的一切并发控制都基于多进程进行考虑(当然实际上也很容易切换到多线程生态)。

而实现在受限资源下进行测试的方法也很简单:我们只需要列出所有可用于测试的设备,然后在测试的时候自动选中基于哪台设备进行测试就好了。

其具体做法如下:

  1. 首先,我们将所有设备的信息写入到一个 json 文件中(或者数据库等任何你想要的地方都行)
  2. 然后,以并发的方式执行测试
  3. pytest.fixure 的方式为每个测试用例设置夹具,使其在运行前选中并锁定用例需要的设备
  4. 在选定的设备上执行用例内容
  5. 执行结束,释放设备锁以备下一个用例使用

当然,上面说的只是最理想的情况,实际工程应用中,还应考虑到更多问题:

  1. 如果存在不同型号的设备,有些设备可能缺失某种特性导致无法执行某些测试用例,应该如何正确选择设备?
  2. 如果一个测试用例需要同时连接到不同的机器上做验证(如交叉校验,双机备份等场景),应如何处理?
  3. 如果多个用例使用同一批资源,是否可能产生死锁问题?
    这些问题需要更加深入地理解当前项目的用例执行方式,并不能不加区分放到一起讨论,故我们在此不继续讨论。

资源

综上过程,笔者创建了一个简单的实现示例:focksor/notebook_demo__pytest_limited_concurrency。希望对你有帮助

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

结构化智能编程:用树形向量存储重构AI代码理解范式

结构化智能编程:用树形向量存储重构AI代码理解范式 告别暴力embedding,通过分层存储策略让AI精准理解百万行代码库 在AI编程助手日益普及的今天,开发者面临一个新的困境:当项目规模达到数万甚至数百万行代码时,传统的暴力向量化方法不仅效率低下,而且往往导致AI理解偏差。…

GPT5 / 深度研究功能 无法触发

具体表现为: 1.没有GPT5标识2.回答是GPT43.无法触发深度研究功能请问如何解决?

一键脚本:自动安装 Nginx + Certbot + HTTPS(Let‘s Encrypt)

创建脚本文件​: vi setup_nginx_https.sh脚本内容: #!/bin/bash# # 一键安装 Nginx Certbot HTTPS (CentOS 7) # 功能:自动安装 Nginx、Certbot,配置 HTTPS,自动续期 # 使用方法:./setup_nginx_https.s…

SpringAI与MCP

MCP是什么?MCP 服务 代理服务(Proxy) 标准化接口 自动化适配MCP 的目的,就是让 AI 应用不再“为每个工具定制对接 ”,而是像使用 USB-C 一样,“插上即用”任何外部工具。没mcp之前不同的工具入参和出参千…

Coze用户退出登录流程分析-后端源码

前言 本文将深入分析Coze Studio项目的用户退出登录功能后端实现,通过源码解读来理解整个退出登录流程的架构设计和技术实现。退出登录作为用户认证系统的重要组成部分,主要负责清理用户会话状态,确保用户账户安全。 退出登录功能虽然相对简单…

【应急响应工具教程】Unix/Linux 轻量级工具集Busybox

1、工具简介BusyBox 是一个将常用 Unix/Linux 工具打包在单一可执行文件中的轻量级工具集,被称为 “嵌入式 Linux 的瑞士军刀”。 它将多个精简版的命令行工具(如 ls、cat、cp、mv、grep 等)集成到一个二进制文件中,并通过不同的调…

【React】案例:B站评论

目录 一、核心功能实现 二、id处理和时间处理 三、清空内容并重新聚焦 一、核心功能实现 1.获取评论内容:表单受控绑定 2.点击发布按钮发布评论 二、id处理和时间处理 1.rpid要求一个唯一的随机数id -uuid库 npm install uuid 使用方法:import {v4 as…

sqlite创建数据库,创建表,插入数据,查询数据的C++ demo

sqlite的API可参考&#xff1a;SQLite – C/C | 菜鸟教程 sqlite的官网API可参考&#xff1a;Introduction #include <iostream> #include <sqlite3.h> #include <string>// 回调函数&#xff0c;用于查询结果的输出 static int callback(void* data, int …

部分CSS笔试题讲解

1. box-sizing: border-box 的作用问题&#xff1a; 默认的 CSS 盒模型 (content-box) 中&#xff0c;元素的 width 和 height 属性只指定了内容区域的尺寸。如果你给元素添加了 padding 或 border&#xff0c;这些值会被加在 width/height 之上&#xff0c;导致元素的实际占用…

雅菲奥朗SRE知识墙分享(二):『SRE对智能运维的升级模型』

SRE深度结合AI创新&#xff0c;雅菲奥朗专家刘峰老师总结了近期人工智能运维领域的突破&#xff0c;合计以下15个关键点:一、领域1&#xff1a;Dev&Ops 深度融合• 关键点1. 组织&#xff1a;Google “SREScale” 最新论文提出「单一故障域 单一 SRE 小组」原则&#xff0…

前端 Promise 全面深入解析

一、Promise基础概念 1、什么是Promise? Promise是一个表示异步操作最终完成或失败的对象。它允许你为异步操作的成功结果和失败原因分别绑定相应的处理方法。 2、Promise的三种状态 pending(等待中): 初始状态,既不是成功,也不是失败 fulfilled(已成功): 操作成功完…

【LIN】2.LIN总线通信机制深度解析:主从架构、五种帧类型与动态调度策略

参考文章&#xff1a; Lin总线通信在STM32作为主机代码以及从机程序 基于STM32的LIN总线的实现 STM32F0-LIN总线通讯程序代码 主从调试OK LIN协议通信DEMO及源码剖析 前文已讲解关于LIN帧代码如何实现&#xff1a;【LIN】1.LIN通信实战&#xff1a;帧收发全流程代码实现 帧类型…

Maven的概念与Maven项目的创建

MavenMaven的概念依赖管理项目构建Maven安装Maven项目的创建Maven的第一个项目Maven的第二个项目Maven的概念 Maven 是 Apache 基金会推出的跨平台的项目管理工具&#xff0c;主要服务于基于Java平台的项目构建、依赖管理和项目信息管理&#xff0c;目前是 Java 生态中最主流的…

Mysql之binlog日志说明及利用binlog日志恢复数据操作记录

众所周知,binlog日志对于mysql数据库来说是十分重要的。在数据丢失的紧急情况下,我们往往会想到用binlog日志功能进行数据恢复(定时全备份+binlog日志恢复增量数据部分),化险为夷! 废话不多说,下面是梳理的binlog日志操作解说: 一、初步了解binlog MySQL的二进制日志…

windows安装Elasticsearch,ik分词器,kibana可视化工具

安装地址 elasticsearch安装地址: Past Releases of Elastic Stack Software | Elastic 分词器下载地址: https://github.com/infinilabs/analysis-ik?tabreadme-ov-file kibana下载地址: Past Releases of Elastic Stack Software | Elastic 注意&#xff1a;版本一定要统…

GaussDB 数据库架构师修炼(十八)SQL引擎-SQL执行流程

1 SQL执行流程查询解析&#xff1a;词法分析、语法分析、 语义分析 查询重写&#xff1a;视图和规则展开、基于规则的查询优化 计划生成&#xff1a;路径搜索和枚举、选出最优执行计划 查询执行&#xff1a;基于优化器生成的物理执行计划对数据进行获取和计算2 解析器和优化器S…

能源管理系统中的物联网数据采集:深度探索与操作指南

一、引言物联网&#xff08;Internet of Things, IoT&#xff09;作为数字化时代的核心基础设施&#xff0c;通过将物理世界的设备、物体与网络连接&#xff0c;实现数据的实时感知与交互。而数据采集作为物联网系统的 “神经末梢”&#xff0c;是整个体系运行的基础。本文将从…

Java实现一个简单的LRU缓存对象

LRU&#xff08;Least Recently Used&#xff09;算法的核心思想是&#xff1a;最近使用的数据将被保留&#xff0c;最久未使用的数据将被淘汰。这种策略适用于内存有限、但又需要高频访问的数据场景&#xff0c;比如缓存系统、页面置换算法等。mysql的缓冲池就是使用的LUR Inn…

整体设计 之定稿 “凝聚式中心点”原型 --整除:智能合约和DBMS的在表层挂接 能/所 依据的深层套接 之2

摘要三“式”三“心”三“物” 整数原型三段式表达 的 凝聚式中心点dot 、组织式核心元素位element和分析式内核基因座locus 三者分别以**“等号线&#xff08;Arc&#xff09;”**&#xff08;动态关联&#xff09;、**“边界线&#xff08;Transition&#xff09;”**&#…