pytest自動生成測試類 demo

一、?pytest自動生成測試類 demo

# -*- coding:utf-8 -*-
# @Author: 喵醬
# @time: 2023 - 08 -15
# @File: test4.py
# desc:
import pytest
import unittest# 動態生成測試類def create_test_class(class_name:str, test_cases:list) -> type:"""生成測試類:param class_name: 測試類的類名,是一個字符串:param test_cases: 是一個可迭代的對象(list),每一個元素case是一個字典在pytest測試類中,每一個方法,就是一條case,所以這里將多條case數據,生成測試類的多個方法:return: 測試類,包含多個方法(測試case)"""# 使用 type() 函數動態創建一個繼承自 unittest.TestCase 的子類test_class = type(class_name, (unittest.TestCase,), {})for case in test_cases:test_method = generate_test_method(case)# 動態為測試類添加測試方法setattr(test_class, test_method.__name__, test_method)return test_class# 生成測試方法
def generate_test_method(case: dict) -> callable:"""生成單個測試方法。Args:case (dict): 測試用例字典,包含輸入和輸出的信息。Returns:callable: 生成的測試方法。"""def test_method(self):"""實際執行測試的方法。"""assert case["input"] == case["output"]# 設置測試方法的名稱test_method.__name__ = f"test_{case['name']}"return test_method# 定義測試數據
@pytest.fixture(params=[{"name": "case1", "input": 1, "output": 1},{"name": "case2", "input": 3, "output": 3},
])
def test_case(request):return request.param# 測試生成的測試類
@pytest.mark.usefixtures("test_case")
def test_generator(test_case):test_class = create_test_class("DynamicTestClass", [test_case])# 加載測試類,并創建測試套件suite = unittest.TestLoader().loadTestsFromTestCase(test_class)# 運行測試套件result = unittest.TextTestRunner().run(suite)# 斷言測試結果是否成功assert result.wasSuccessful()

執行?test_generator 方法

運行順序:

1、手動觸發運行??test_generator 方法

2、在執行test_generator 方法 方法之前,會先執行test_case 方法。

3、test_case 方法,數據有2條數據,則test_case 方法會執行兩次

4、test_generator 同樣也會執行兩次。

最終效果,就是生成了兩次名為?DynamicTestClass 的測試類,每個測試類,只生成了一個方法(case)

?二、代碼詳解

2.1 整體運行順序

1、定義了一個函數 create_test_class,用于動態生成測試類。
2、定義了一個函數 generate_test_method,用于生成單個測試方法。
3、使用了 @pytest.fixture 裝飾器定義了一個夾具(fixture) test_case,用于提供測試數據。
4、使用了 @pytest.mark.usefixtures("test_case") 裝飾器標記了一個測試函數 test_generator,表示在執行該測試函數之前需要先執行 test_case 夾具。
5、在函數 test_generator 中,調用了 create_test_class 函數,傳入一個測試數據。然后加載并運行生成的測試類。
6、執行測試時,先執行夾具函數 test_case 來獲取測試數據。
7、根據測試數據,動態生成一個測試類 DynamicTestClass,并為該類添加一個測試方法。
8、創建測試套件,并運行測試套件中的測試用例。
9、使用 unittest.TextTestRunner 運行測試套件,并返回測試結果。
10、最后,根據測試結果判斷是否成功,并進行斷言。


總結起來,整個代碼的執行流程是:先執行夾具函數獲取測試數據,然后動態生成測試類并創建測試套件,最后運行測試套件中的測試用例,輸出測試結果,并進行斷言判斷。

2.1 定義測試數據

# 定義測試數據
@pytest.fixture(params=[{"name": "case1", "input": 1, "output": 1},{"name": "case2", "input": 3, "output": 3},
])
def test_case(request):return request.param

1、@pytest.fixture 是 pytest 框架提供的裝飾器,用于定義夾具(fixture)。夾具是在測試函數或測試類執行前后進行特定操作、提供數據等的函數。

2、在這段代碼中,test_case 是一個夾具函數。通過 @pytest.fixture 裝飾器對其進行標記,表示它是一個夾具。

3、params 參數是用來定義多個測試用例數據的列表。每個測試用例數據都是一個字典,包含了三個鍵值對:name、input 和 output。name 是用來描述測試用例的名稱,input 是輸入數據,output 是預期輸出結果。

4、當執行測試函數時,pytest 會自動調用夾具函數,并根據參數列表中的每個字典生成不同的測試數據。每個測試用例都會獨立執行一次測試函數,并且將對應的測試數據作為參數傳遞給測試函數。

在這段代碼中,夾具函數 test_case 返回 request.param,request.param 表示當前測試用例的數據。當執行 test_generator 函數時,會先調用夾具函數 test_case 獲取測試數據,然后將該測試數據作為參數傳遞給 test_generator 函數。

2.2?運行生成的測試類?test_generator

# 測試生成的測試類
@pytest.mark.usefixtures("test_case")
def test_generator(test_case):test_class = create_test_class("DynamicTestClass", [test_case])# 加載測試類,并創建測試套件suite = unittest.TestLoader().loadTestsFromTestCase(test_class)# 運行測試套件result = unittest.TextTestRunner().run(suite)# 斷言測試結果是否成功assert result.wasSuccessful()

1、裝飾器:?@pytest.mark.usefixtures("test_case")

@pytest.mark.usefixtures("test_case") 是 Pytest 測試框架中一個裝飾器標記(decorator marker),用于指定在運行測試用例之前需要先執行的 fixture(夾具)。

fixture 是一種在測試運行之前準備測試環境、數據或者資源的機制。它可以用來為測試用例提供必要的前置條件,例如設置數據庫連接、創建臨時文件、初始化測試數據等。

在給定的代碼中,@pytest.mark.usefixtures("test_case") 將 "test_case" 作為 fixture 的名稱進行標記。這意味著在運行使用了該標記的測試用例之前,Pytest 將先執行名為 "test_case" 的 fixture 方法。

使用 @pytest.mark.usefixtures 標記可以方便地應用 fixture,而無需在每個測試用例函數中顯式調用 fixture。通過將標記應用于測試用例函數,測試框架將自動處理 fixture 的執行和銷毀,并將其提供給測試用例函數作為參數使用。

總之,@pytest.mark.usefixtures("test_case") 允許你在測試運行之前自動執行名為 "test_case" 的 fixture 方法,為測試用例提供必要的準備工作。

2.3?generate_test_method

generate_test_method 函數中的 case 參數是一個字典類型。在示例代碼中,test_case 是一個包含測試用例信息的字典,其中包括字段 "name""input""output",用于表示測試名稱、輸入和期望輸出。

傳遞給 generate_test_method 函數的 case 參數應該具有與示例中定義的測試用例字典相同的結構。例如:

case = {"name": "example", "input": 1, "output": 2}
test_method = generate_test_method(case)

在這個示例中,case 是一個字典,表示一個測試用例,包含 "name""input""output" 字段。generate_test_method 函數將根據這些字段生成一個測試方法,并為該方法設置名稱。

2、create_test_class

在函數 create_test_class 中,test_cases 參數的類型可以是任何可迭代對象,比如列表或元組。

示例代碼中使用了迭代循環來遍歷 test_cases,假設 test_cases 是一個列表,每個元素都是一個測試用例字典。所以 test_cases 的結構可以類似以下的形式:

test_cases = [{"name": "case1", "input": 1, "output": 2},{"name": "case2", "input": 3, "output": 3},
]

其中,每個 test_cases 列表的元素都是一個包含測試用例信息的字典。

所以,在調用 create_test_class 函數時,你可以傳遞一個包含測試用例字典的列表作為 test_cases 參數,動態生成相應的測試類。

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

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

相關文章

前端面試的性能優化部分(10)每天10個小知識點

目錄 系列文章目錄前端面試的性能優化部分(1)每天10個小知識點前端面試的性能優化部分(2)每天10個小知識點前端面試的性能優化部分(3)每天10個小知識點前端面試的性能優化部分(4)每天…

TiDB數據庫從入門到精通系列之一:TiDB數據庫的軟硬件環境要求和系統配置檢查

TiDB數據庫從入門到精通系列之一:TiDB數據庫的軟硬件環境要求和系統配置檢查 一、軟件和硬件配置要求1.操作系統及平臺要求2.服務器建議配置3.網絡要求4.磁盤空間要求 二、TiDB 環境與系統配置檢查1.在 TiKV 部署目標機器上添加數據盤 EXT4 文件系統掛載參數2.設置 …

RESTAPI簡介與DRF使用

RESTAPI 以資源為url&#xff0c;通過不同的請求方式實現不同的行為。 以資源名作為url POST:增 …/student/ GET&#xff1a;查所有 …/student/ GET&#xff1a;查單個 …/student/<pk>/ 獲取idpk的學生 DELETE&#xff1a;刪 …/student/<pk>/ PUT&#…

輕量級 Spring Task 任務調度可視化管理

Spring Task/Spring Scheduler 傻傻分不清 首先做一下“名詞解釋”&#xff0c;分清楚這兩者的區別&#xff1a; Spring Task Spring Task 是 Spring 框架自帶的一個任務調度模塊&#xff0c;提供了基本的任務調度功能。它是通過 Java 的 Timer 和 TimerTask 類來實現的&…

python獲取音樂文件

瀏覽器打開音樂地址 http://www.htqyy.com/top/hot 點擊第一首歌曲&#xff0c;會打開新的網頁并且可以獲取 改歌曲的id&#xff0c;就是url中的33 在播放頁面點擊F12&#xff0c;打開開發者調試功能 如下圖所示&#xff0c;在script腳本中可以獲取歌曲的下載數據 host&#…

滑模控制器理論推導和matlab/simulink實例分享

滑模控制的運動軌跡主要分為兩個方面&#xff1a;(1)系統的任意初始狀態向滑模面運動階段&#xff1b;(2)系統到達滑模面后并且慢慢趨于穩定的階段。所以&#xff0c;對于滑模變結構控制器的設計&#xff0c;對應于系統運動的兩個階段&#xff0c;可以分為兩個部分&#xff1a;…

從規劃到落地,數字化工廠如何破局

隨著第四次工業革命的推進&#xff0c;數字化工廠解決方案已經成為制造業轉型升級的必經之路。然而&#xff0c;在實際推進過程中&#xff0c;許多企業卻面臨著規劃難以落地、投資回報率低、人才短缺等問題。如何破局&#xff0c;實現數字化工廠的順利轉型&#xff0c;成為制造…

卡爾曼濾波

初見Kalman 假設我養了一只豬&#xff1a; 一周前&#xff0c;這只豬的體重是460.5kg。注意&#xff0c;在這里我用了0.5&#xff0c;表示其實我對這只豬一周前的體重并不是那么確定的&#xff0c;也就是說&#xff0c;46kg這個體重有0.5kg的誤差。現在&#xff0c;我又養了這只…

Java基礎(十二)面向對象編程 OOP

一、抽象數據類型 1.面向對象基本概念 1. 面向對象 面向對象程序設計&#xff08;OOP&#xff09;是一種基于對象概念的軟件開發方法&#xff0c;是目前軟件開發的主流方式。 常見面向對象的語言&#xff1a;C 、Python 、Java 常見面向過程的語言&#xff1a;C 面向對象的三…

計算機競賽 python+opencv+機器學習車牌識別

0 前言 &#x1f525; 優質競賽項目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于機器學習的車牌識別系統 &#x1f947;學長這里給一個題目綜合評分(每項滿分5分) 難度系數&#xff1a;4分工作量&#xff1a;4分創新點&#xff1a;3分 該項目較為新穎&#xff0c;適…

使用插件實現pdf,word預覽功能

效果 代碼&#xff1a; 插件地址&#xff1a; https://github.com/501351981/vue-office <a-modalv-model:visible"visible":title"title"ok"handleOk":bodyStyle"bodyStyle":width"1200":maskClosable"false"…

如何在Vue表單處理中實現表單的條件渲染

在Vue開發中&#xff0c;我們經常會遇到需要根據某些條件來渲染表單的情況。這種情況下&#xff0c;我們需要靈活地根據條件來展示或隱藏一些表單字段。本文將介紹如何在Vue中實現表單的條件渲染&#xff0c;并提供了代碼示例。 一、使用v-if指令實現簡單的條件渲染 在Vue中&a…

2023年網絡安全比賽--綜合滲透測試(超詳細)

一、競賽時間 180分鐘 共計3小時 二、競賽階段 競賽階段 任務階段 競賽任務 競賽時間 分值 1.掃描目標靶機將靶機開放的所有端口,當作flag提交(例:21,22,23); 2.掃描目標靶機將靶機的http服務版本信息當作flag提交(例:apache 2.3.4); 3.靶機網站存在目錄遍歷漏洞,請將…

Linux設備樹詳解

Linux 設備樹詳解 Linux 操作系統早期是針對個人電腦設備而開發的操作系統&#xff0c;而個人電腦處理器產商較為單一&#xff08;例如只有 Intel&#xff0c;AMD&#xff09;同時個人電腦產商均使用 Intel 或 AMD 制造的處理器&#xff0c;業界形成了統一的總線/硬件接口標準…

JavaScript進階 第二天

深入對象內置構造函數 一. 深入對象 創建對象三種方式構造函數實例成員&靜態成員 1.1 創建對象三種方式 ① 利用對象字面量創建對象 const o {name: 哈哈 } ② 利用new Object 創建對象 const o new Object({ name: 哈哈 }) ③ 構造函數創建對象 1.2 構造函數 …

探索規律:Python地圖數據可視化藝術

文章目錄 一 基礎地圖使用二 國內疫情可視化圖表2.1 實現步驟2.2 完整代碼2.3 運行結果 一 基礎地圖使用 使用 Pyecharts 構建地圖可視化也是很簡單的。Pyecharts 支持多種地圖類型&#xff0c;包括普通地圖、熱力圖、散點地圖等。以下是一個構建簡單地圖的示例&#xff0c;以…

認識Transformer:入門知識

視頻鏈接&#xff1a; https://www.youtube.com/watch?vugWDIIOHtPA&listPLJV_el3uVTsOK_ZK5L0Iv_EQoL1JefRL4&index60 文章目錄 Self-Attention layerMulti-head self-attentionPositional encodingSeq2Seq with AttentionTransformerUniversal Transformer Seq2Seq …

淺談 EMP-SSL + 代碼解讀:自監督對比學習的一種極簡主義風

論文鏈接&#xff1a;https://arxiv.org/pdf/2304.03977.pdf 代碼&#xff1a;https://github.com/tsb0601/EMP-SSL 其他學習鏈接&#xff1a;突破自監督學習效率極限&#xff01;馬毅、LeCun聯合發布EMP-SSL&#xff1a;無需花哨trick&#xff0c;30個epoch即可實現SOTA 主要…

08 qt進程和網絡編程(cs模型)

一 、qt進程 qt中進程最主要的任務就是啟動額外應用程序 并且跟他們之間通信。進程類為QProcess 定義用途Header:#include qmake:QT += coreInherits:QIODevice//繼承于IO設備類1.1 QProcess基本使用 第一步:創建一個QProcess對象 // process = new QProcess(this); //說明…

資訊速遞 | ArkUI-X 預覽版已正式開源!

OpenHarmony項目群技術指導委員會&#xff08;以下簡稱“TSC”&#xff09;-跨平臺應用開發框架TSG所孵化項目 —— ArkUI-X&#xff0c;近期已正式開源 &#xff0c;開發者基于一套主代碼&#xff0c;就可以將在OpenHarmony上開發的精美、高性能應用同時運行在Android、iOS等其…