pytest 并發執行用例(基于受限的測試資源)

概要

本文主要介紹了如何在測試資源(被測對象)受限的情況下,使用 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;”**&#…