高效執行自動化用例:分布式執行工具pytest-xdist實戰!

01、聲明

在介紹pytest-xdist時,不講任何原理,需要看原理的請移至官方:https://pypi.org/project/pytest-xdist/

當我們自動化測試用例非常多的時候, 一條條按順序執行會非常慢,pytest-xdist的出現就是為了讓自動化測試用例可以分布式執行,從而節省自動化測試時間,pytest-xdist是屬于進程級別的并發

pytest-xdist插件在測試過程中可以使我們的測試用例一起并行測試,運行情況是根據你運行環境存在多個CPU,運行過程中可以進行組合測試運行,從而縮短我們的測試時間。

1、pytest-xdist插件安裝

只需要在終端中運行如下命令:

pip install pytest-xdist

2、pytest-xdist執行用例的條件

需滿足以下條件:

  • 每一條用例必須是獨立的。用例之間沒有依賴關系,用例可以完全獨立運行【獨立運行】

  • 每一條用例沒有特定的執行順序,就是每條用例都要遵循隨機執行【隨機執行】

  • 每條用例的測試結果不能影響到其他的測試用例。【不影響其他用例】

pytest-sdist?與?pytest-parallel的小區別

  • pytest-xdist在win中調用的是多進程,而parallel在win中調用的是多線程,win中只有單進程

  • pytest-xdist調用時,會使session執行多次,算是一個win的bug,但是官方給出的解決方案是,使用filelock鎖

  • 使用parallel時,在win中調用多線程,但是allure報告不支持多線程,allure是集成報告,根據session來集成,所以就是出現一個線程一個報告

3、pytest-xdist使用方法

pytest -n x

n:表示使用并行參數
x:表示需要啟動多少個分布式,也即使用CPU的個數

  • n auto:可以自動檢測到系統的CPU核數;從測試結果來看,檢測到的是邏輯處理器的數量

  • 使用auto等于利用了所有CPU來跑用例,此時CPU占用率會特別高

說明:建議最多使用1/2的CPU個數來進行執行,消耗資源太多,導致電腦太卡

接下來看實例:

在終端中分別輸入并執行:pytest -vs、pytest -vs -n 2

圖片

從結果可以看出,不是用分布式運行測試用例,總共用時10.71秒
?

那么接下來我們使用分布式進行運行用例,看看他運行的時間:

圖片

圖片

可以看出使用分布式運行用例,同時有2個線程進行執行用例,時間為6.08秒,縮短了很多的時間。

4、pytest-xdist自定義執行模式

按照同一個作用域方法來分組,然后將每個測試組發給可以執行的worker,確保同一個組的測試用例在同一個進程中執行:

 

--dist=loadscope #每個worker按類執行
示例:
pytest -v -n 3 --dist=loadscope test_demo.py

按照同一個文件名來分組,然后將每個測試組發給可以執行的worker,確保同一個組的測試用例在同一個進程中執行:

 

--dist=loadfile #每個worker按文件執行
示例:
pytest -v -n 3 --dist = loadfile test_xdist.py test_xdist_02.py test_xdist_03.py

將每個用例,分別發給所有的執行器worker,相當于開了幾個執行器worker,同一個用例就執行幾遍:

 

--dist=each
示例:pytest -v -n 3 --dist = each test_xdist.p

將待運行的用例隨機發給可用的執行器worker,用例執行順序隨機的,目前默認采用這種方式:

 

--dist=load 和 --dist==no
示例:pytest -v -n 3 --dist = load test_xdist.py

5、如何讓scope=session的fixture在test session中僅僅執行一次

pytest-xdist是讓每個worker進程執行屬于自己的測試用例集下的所有測試用例,這意味著在不同進程中,不同的測試用例可能會調用同一個scope范圍級別較高(例如session)的fixture,該fixture則會被執行多次,這不符scope=session的預期


雖然pytest-xdist沒有內置的支持來確保會話范圍的夾具僅執行一次,但是可以通過使用鎖定文件進行進程間通信來實現。

import pytestfrom filelock import FileLock@pytest.fixture(scope="session",autouse=True)def login(tmp_path_factory, worker_id):# 如果是單機運行 則運行這里的代碼塊【不可刪除、修改】if worker_id == "master":"""【自定義代碼塊】這里就寫你要本身應該要做的操作,比如:登錄請求、新增數據、清空數據庫歷史數據等等"""uuid_value = uuid.uuid1()token = uuid_value.hexprint("fixture:請求登錄接口,獲取token", token)os.environ['token'] = token# 如果測試用例有需要,可以返回對應的數據,比如 tokenreturn token# 如果是分布式運行# 獲取所有子節點共享的臨時目錄,無需修改【不可刪除、修改】root_tmp_dir = tmp_path_factory.getbasetemp().parent# 【不可刪除、修改】fn = root_tmp_dir / "data.json"# 【不可刪除、修改】with FileLock(str(fn) + ".lock"):# 【不可刪除、修改】if fn.is_file():# 緩存文件中讀取數據,像登錄操作的話就是 token 【不可刪除、修改】token = json.loads(fn.read_text())print(f"讀取緩存文件,token 是{token} ")else:"""【自定義代碼塊】跟上面 if 的代碼塊一樣就行"""uuid_value = uuid.uuid1()token = uuid_value.hexprint("fixture:請求登錄接口,獲取token", token)# 【不可刪除、修改】fn.write_text(json.dumps(token))print(f"首次執行,token 是{token} ")# 最好將后續需要保留的數據存在某個地方,比如這里是 os 的環境變量os.environ['token'] = tokenreturn token
  • 示例只需要執行一次login(因為它是只需要執行一次來定義配置選項,等等)

  • 當第一次請求這個fixture時,則會利用FileLock僅產生一次fixture數據

  • 當其他進程再次請求這個fixture時,則會從文件中讀取數據

最后感謝每一個認真閱讀我文章的人,看著粉絲一路的上漲和關注,禮尚往來總是要有的,雖然不是什么很值錢的東西,如果你用得到的話可以直接拿走!

軟件測試面試文檔

我們學習必然是為了找到高薪的工作,下面這些面試題是來自阿里、騰訊、字節等一線互聯網大廠最新的面試資料,并且有字節大佬給出了權威的解答,刷完這一套面試資料相信大家都能找到滿意的工作。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/70292.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/70292.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/70292.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【ISO 14229-1:2023 UDS診斷全量測試用例清單系列:第十八節】

ISO 14229-1:2023 UDS診斷服務測試用例全解析(ResponseOnEvent_0x86服務) 作者:車端域控測試工程師 更新日期:2025年02月14日 關鍵詞:UDS協議、0x86服務、事件響應、ISO 14229-1:2023、ECU測試 一、服務功能概述 0x86…

deepseek多列數據對比,聯想到excel的高級篩選功能

目錄 1 業務背景 ?2 deepseek提示詞輸入 ?3 聯想分析 4 EXCEL高級搜索 1 業務背景 系統上線的時候經常會遇到一個問題,系統導入的數據和線下的EXCEL數據是否一致,如果不一致,如何快速找到差異值,原來腦海第一反應就是使用公…

TailwindCss的vue3安裝使用

按照官網的安裝教程,屬性最后無法生效,這是自我改良版,添加了額外步驟,但是每次引入新的tailwindcss屬性 需要重新跑一次項目 npm下載tailwindcss npm install -D tailwindcss npx初始化tailwind配置 npx tailwindcss init 此時根…

個人博客測試報告

一、項目背景 個人博客系統采用前后端分離的方法來實現,同時使用了數據庫來存儲相關的數據,同時將其部署到云服務器上。前端主要有四個頁面構成:登錄頁、列表頁、詳情頁以及編輯頁,以上模擬實現了最簡單的個人博客系統。其結合后…

Python----數據結構(單鏈表:節點,是否為空,長度,遍歷,添加,刪除,查找)

一、鏈表 鏈表是一種線性數據結構,由一系列按特定順序排列的節點組成,這些節點通過指針相互連接。每個節點包含兩部分:元素和指向下一個節點的指針。其中,最簡單的形式是單向鏈表,每個節點含有一個信息域和一個指針域&…

夜鶯監控發布 v8.beta5 版本,優化 UI,新增接口認證方式便于鑒權

以防讀者不了解夜鶯,開頭先做個介紹: 夜鶯監控,英文名字 Nightingale,是一款側重告警的監控類開源項目。類似 Grafana 的數據源集成方式,夜鶯也是對接多種既有的數據源,不過 Grafana 側重在可視化&#xff…

什么是Embedding、RAG、Function calling、Prompt engineering、Langchain、向量數據庫? 怎么使用

什么是Embedding、RAG、Function calling、Prompt engineering、Langchain、向量數據庫? 怎么使用 目錄 什么是Embedding、RAG、Function calling、Prompt engineering、Langchain、向量數據庫? 怎么使用Embedding(嵌入)RAG(檢索增強生成)Function calling(函數調用)Pr…

SQLMesh 系列教程5- 詳解SQL模型

本文將詳細介紹 SQLMesh 的 SQL 模型組成要素及其在實際項目中的應用。SQLMesh 是一個強大的數據工程工具,其 SQL 模型由 MODEL DDL、預處理語句、主查詢、后處理語句以及可選的 ON VIRTUAL UPDATE 語句組成。我們將通過一個電商平臺每日銷售報告的實例,…

DeepSeek 接入PyCharm實現AI編程!(支持本地部署DeepSeek及官方DeepSeek接入)

前言 在當今數字化時代,AI編程助手已成為提升開發效率的利器。DeepSeek作為一款強大的AI模型,憑借其出色的性能和開源免費的優勢,成為許多開發者的首選。今天,就讓我們一起探索如何將DeepSeek接入PyCharm,實現高效、智…

從駕駛員到智能駕駛:汽車智能化進程中的控制與仿真技術

在汽車技術持續演進的歷程中,人類駕駛員始終是一個極具研究價值的智能控制系統“原型”。駕駛員通過視覺感知、行為決策與操作執行的閉環控制,將復雜的駕駛任務轉化為車輛的實際動作,同時動態適應道路環境的變化。這一過程不僅體現了高度的自…

Spring Boot項目的基本設計步驟和相關要點介紹

以下是一個關于Spring Boot項目的基本設計步驟和相關要點介紹,我們以一個簡單的示例應用——員工管理系統為例進行說明: 一、項目概述 員工管理系統旨在實現對公司員工信息的有效管理,包括員工基本信息錄入、查詢、更新以及刪除等功能。通過Spring Boot框架來快速搭建后端…

【Java】泛型與集合篇(一)

泛型與集合(一) 泛型泛型的核心作用泛型類型(類)定義與使用類型參數命名約定泛型方法定義與調用與泛型類的區別通配符上界通配符下界通配符有界類型參數類型擦除集合框架核心接口Collection 接口Map 接口Collection 接口操作的常用方法基本操作批量操作數組操作流操作方法L…

HarmonyOS組件之Tabs

Tabs 1.1概念 Tabs 視圖切換容器,通過相適應的頁簽進行視圖頁面的切換的容器組件每一個頁簽對應一個內容視圖Tabs擁有一種唯一的子集元素TabContent 1.2子組件 不支持自定義組件為子組件,僅可包含子組件TabContent,以及渲染控制類型 if/e…

華為FusionCompute虛擬化平臺

一、華為FusionCompute虛擬化套件介紹 華為FusionCompute虛擬化套件是業界領先的虛擬化解決方案,能夠幫助客戶帶來如下的價值,從而大幅提升數據中心基礎設施的效率。 幫助客戶提升數據中心基礎設施的資源利用率;幫助客戶成倍縮短業務上線周期…

使用apt-rdepends制作軟件離線deb安裝包

使用apt-rdepends制作軟件離線deb安裝包 除基礎軟件外,還要獲取軟件依賴包。 依賴包工具安裝 apt-get install apt-rdependsapt-rdepends工具使用 使用apt-rdepends工具,遞歸方式分析軟件依賴,下載軟件包本體,和依賴包。制作時…

【ISO 14229-1:2023 UDS診斷(ECU復位0x11服務)測試用例CAPL代碼全解析⑩】

ISO 14229-1:2023 UDS診斷【ECU復位0x11服務】_TestCase10 作者:車端域控測試工程師 更新日期:2025年02月18日 關鍵詞:UDS診斷協議、ECU復位服務、0x11服務、ISO 14229-1:2023 TC11-010測試用例 用例ID測試場景驗證要點參考條款預期結果TC…

什么是Scaling Laws(縮放定律);DeepSeek的Scaling Laws

什么是Scaling Laws(縮放定律) Scaling Laws(縮放定律)在人工智能尤其是深度學習領域具有重要意義,以下是相關介紹及示例: 定義與內涵 Scaling Laws主要描述了深度學習模型在規模(如模型參數數量、訓練數據量、計算資源等)不斷擴大時,模型性能與這些規模因素之間的…

大一計算機的自學總結:前綴樹(字典樹、Trie樹)

前言 前綴樹&#xff0c;又稱字典樹&#xff0c;Trie樹&#xff0c;是一種方便查找前綴信息的數據結構。 一、字典樹的實現 1.類描述實現 #include <bits/stdc.h> using namespace std;class TrieNode { public:int pass0;int end0;TrieNode* nexts[26]{NULL}; };Tri…

【存儲中間件API】MySQL、Redis、MongoDB、ES常見api操作及性能比較

常見中間件api操作及性能比較 ?? MySQL crud操作?? maven依賴?? 配置?? 定義實體類?? 常用api ?? Redis crud操作?? maven依賴?? 配置?? 常用api ?? MongoDB crud操作?? maven依賴?? 配置文件?? 定義實體類?? MongoDB常用api ?? ES crud操作 ??…

51單片機入門_10_數碼管動態顯示(數字的使用;簡單動態顯示;指定值的數碼管動態顯示)

接上篇的數碼管靜態顯示&#xff0c;以下是接上篇介紹到的動態顯示的原理。 動態顯示的特點是將所有位數碼管的段選線并聯在一起&#xff0c;由位選線控制是哪一位數碼管有效。選亮數碼管采用動態掃描顯示。所謂動態掃描顯示即輪流向各位數碼管送出字形碼和相應的位選&#xff…