pytest 的 request fixture:實現個性化測試需求

在前文章中,我們看到pytest_repeat源碼中有這樣一段

@pytest.fixture
def __pytest_repeat_step_number(request):marker = request.node.get_closest_marker("repeat")count = marker and marker.args[0] or request.config.option.count......

看到參數為request,我們知道fixture裝飾的函數入參,只能是其他fixture,所以這里request一定也是fixture。

那它到底怎么用呢?這篇文章將詳細介紹,并通過實戰項目加深理解。

request fixture

The request fixture is a special fixture providing information of the requesting test function.這是pytest官方文檔的介紹,意思就是請求fixture是一個特殊的fixture,提供請求測試函數的信息。

源碼直達(https://github.com/pytest-dev/pytest/blob/main/src/_pytest/fixtures.py),感興趣的朋友可以查看源碼FixtureRequest

文檔直達(https://docs.pytest.org/en/latest/reference/reference.html#pytest.FixtureRequest)

request.node

當前測試用例的節點對象,表示當前執行的測試用例。

可以使用該對象獲取測試用例的名稱、文件路徑、測試類等信息。

import pytest@pytest.fixture
def my_fixture(request):node = request.nodeprint(f"Current test case: {node.name}")print(f"Test file path: {node.fspath}")print(f"Test class: {node.getparent}")def test_demo(my_fixture):pass

輸出結果為:

Current test case: test_demo
Test file path: /Users/pxl/test_dir/test_demo.py
Test class: <bound method Node.getparent of <Function test_demo>>

fixture 使用了request 參數,并通過request.node 獲取了當前測試用例的相關信息。

具體來說,我們打印了當前測試用例的名稱、文件路徑和測試類名稱。

request.config

前運行的配置對象,表示當前 Pytest 的配置信息。可以使用該對象獲取命令行參數、配置文件設置等信息。

pytest.ini[pytest]
markers =p0: 冒煙p1: 功能
@pytest.fixture
def my_fixture(request):config = request.configprint(f"Command line arguments: {config.option}")print(f"INI file options: {config.getini('markers')}")

該 fixture 使用了 request 參數,并通過 request.config 獲取了當前 Pytest 的配置信息。

具體來說,我們打印了命令行參數和配置文件中的一個選項。

request.param

當前 fixture 的參數,表示當前 fixture 的實例所需的參數值

@pytest.fixture(params=[1, 2, 3])
def my_fixture(request):param_value = request.paramprint(f"Current parameter value: {param_value}")return param_value

該 fixture 使用了 request 參數,并通過 request.param 獲取了當前實例所需的參數值。

request.fixturename

返回當前 fixture 的名稱。

@pytest.fixture
def my_fixture(request):fixture_name = request.fixturenameprint(f"Current fixture name: {fixture_name}")

我們使用 request.fixturename 獲取了當前 fixture 的名稱,并將其打印出來.

request.fixturenames

返回當前測試函數所使用的所有 fixture 的名稱列表

@pytest.fixture
def my_fixture(request):passdef test_example(my_fixture, request):fixture_names = request.fixturenamesprint(f"Current fixture name: {fixture_names}")

我們使用 request.fixturenames獲取了test_example使用的所有 fixture 的名稱

request.cls

當前測試類的類對象。

class TestClass:@pytest.fixturedef my_fixture(self, request):class_obj = request.clsprint(f"Current class object: {class_obj}")

使用 request.cls 獲取了當前測試類的類對象,并將其打印出來。

request.addfinalizer(finalizer_func)

在 fixture 完成后執行指定的函數。

@pytest.fixture
def my_fixture(request):def finalizer_func():print("Finalizer function called")request.addfinalizer(finalizer_func)print("Fixture setup")

我們使用 request.addfinalizer() 方法注冊了一個 finalizer 函數 finalizer_func。

該函數將在 fixture 執行完畢后被調用,并打印一條消息。

request.applymarker(marker)

為當前測試用例或 fixture 應用指定的 marker。

@pytest.fixture
def my_fixture(request):request.applymarker(pytest.mark.slow)

我們使用 request.applymarker() 方法為當前 fixture 添加了一個 pytest.mark.slow 的標記。

這個標記可以被 Pytest 識別并用于特定的測試運行策略。

request.config.getoption(name)

獲取命令行選項的值。

@pytest.fixture
def my_fixture(request):my_option = request.config.getoption("--my_option")print(f"Value of --my_option: {my_option}")

我們使用 request.config.getoption() 方法獲取了命令行選項 --my_option 的值,并將其打印出來。

request.module

當前測試用例所屬的模塊對象

def my_fixture(request):module_obj = request.moduleprint(f"Current module object: {module_obj}")

我們使用 request.module 獲取了當前測試用例所屬的模塊對象,并將其打印出來

request.param_index

參數化 fixture 的參數索引

@pytest.fixture(params=[1, 2, 3])
def my_fixture(request):param_value = request.paramparam_index = request.param_indexprint(f"Current parameter value: {param_value}")print(f"Current parameter index: {param_index}")return param_value

我們對帶有參數的 my_fixture fixture 進行了參數化。

使用 request.param_index 可以獲取當前參數在參數列表中的索引,并將其打印出來。

request.keywords

當前測試用例的關鍵字集合

@pytest.fixture
def my_fixture(request):keywords = request.keywordsprint(f"Current test keywords: {keywords}")

我們使用 request.keywords 獲取了當前測試用例的關鍵字集合,并將其打印出來

request.getfixturevalue(fixturename)

獲取已注冊的 fixture 對象的值

import pytest@pytest.fixture
def my_fixture():return "Hello, Fixture!"def test_example(request):fixture_value = request.getfixturevalue("my_fixture")assert fixture_value == "Hello, Fixture!"

實戰

到這里request fixture的常用屬性和方法應該了解差不多了。更多屬性和方法,可以參考官方文檔。

接下來我們就利用request屬性實現數據庫環境的切換。看實現代碼

conftest.pydef pytest_addoption(parser):parser.addoption("--test", action="store_true", help="Run tests in test mode")@pytest.fixture(scope="session")
def config_parser(request):class Clazz(object):config = ConfigParser()config.read(config_path)section = 'test' if request.config.getoption("--test") else 'prod'log.info(f"section: {config.sections()}")db_host = config.get(section, 'host')db_port = config.get(section, 'port')db_username = config.get(section, 'username')db_password = config.get(section, 'password')db_database = config.get(section, 'database')api_url = config.get(section, 'url')return Clazz@pytest.fixture(scope="session")
def db_connection(config_parser):db_conn = MySQLDB(config_parser.db_host,int(config_parser.db_port),config_parser.db_username,config_parser.db_password,config_parser.db_database)yield db_conndb_conn.close()

config_parser 是一個會話級別的 fixture,它返回一個配置解析器對象。這個配置解析器對象可以讀取配置文件,并根據傳入的命令行參數 --test 來確定讀取哪個配置文件的特定部分(測試環境或生產環境)。

具體流程如下:

首先,在 pytest_addoption 函數中,通過調用 parser.addoption() 方法來添加一個命令行選項 --test,它的作用是告訴 pytest 在測試模式下運行。

在 config_parser fixture 中,我們首先創建了一個名為 Clazz 的類,它包含了從配置文件中讀取的各個配置項的值。

根據傳入的 --test 參數值,決定使用測試環境還是生產環境的配置。如果 --test 參數被指定,則使用配置文件中的 test 部分,否則使用 prod 部分。

通過 config.get() 方法獲取具體的配置項的值,例如 db_host、db_port、db_username 等。

最后,將 Clazz 類作為返回值,供其他測試代碼使用。

db_connection 是一個會話級別的 fixture,它返回一個數據庫連接對象。

這個對象在測試期間可以被使用,并在測試完成后進行關閉。

具體流程如下:

在 db_connection fixture 中,我們創建了一個 MySQLDB 對象,將從 config_parser fixture 中獲取的數據庫連接參數傳入。

使用 yield 語句將數據庫連接對象返回給測試代碼。yield 使得這個 fixture 可以在測試期間提供數據庫連接,而在測試完成后繼續執行下面的代碼。

在 yield 之后的代碼將在測試完成后執行,這里使用 db_conn.close() 來關閉數據庫連接。

可以看到我們正是使用request.config.getoption這個方法來 獲取命令行選項的值。

這段代碼展示了如何使用 pytest 的 fixture 來管理測試環境和資源的初始化和清理。

通過使用會話級別的 fixture,可以確保在整個測試會話期間只進行一次配置解析和數據庫連接操作,避免重復的開銷和不必要的操作。

后續

到這里我們有攻克了一個知識點request,不僅介紹了它的基本用法,也介紹了筆者在工作中真實使用場景。多加嘗試,才能印象深刻。

最后:?下方這份完整的軟件測試視頻教程已經整理上傳完成,需要的朋友們可以自行領取?【保證100%免費】

在這里插入圖片描述

軟件測試面試文檔

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

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

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

相關文章

Stable Cascade又升級了,現在只需要兩個模型

Stable Cascade這個模型&#xff0c;大家如果還有印象的話&#xff0c;是需要下載三個模型的&#xff0c;分別是Stage_a,Stage_b和Stage_c,如果全都下載下來&#xff0c;需要20多個G&#xff0c;但是最近使用ComfyUI做嘗試的時候&#xff0c;發現官方的案例中已經沒有用到單獨的…

手擼AI-2: 設置腳本參數與設置隨機種子

一.設置腳本參數 1. 代碼示例 在完整的模型訓練代碼中,我們時常能看到通過python train.py --params 來訓練模型,這也是在無UI界面的服務器上訓練模型最主要的方法,因此使用腳本并設置腳本參數尤為重要. 我們通常會將腳本設置的代碼寫在config,py中,再用訓練主函數main.py進行…

P4715 【深基16.例1】淘汰賽題解

題目 有&#xff08;n≤7&#xff09;個國家參加世界杯決賽圈且進入淘汰賽環節。已經知道各個國家的能力值&#xff0c;且都不相等。能力值高的國家和能力值低的國家踢比賽時高者獲勝。1號國家和2號國家踢一場比賽&#xff0c;勝者晉級。3號國家和4號國家也踢一場&#xff0c;…

C++用臨時對象構造新對象

C用臨時對象構造新對象 //用臨時對象構造同類型的新對象&#xff0c;該臨時對象不產生&#xff1b; // 直接用生成臨時對象的方法構造新對象&#xff0c;這是編譯器對代碼的優化&#xff0c;效率更高 #include<iostream> using namespace std; class MyClass { public:…

Golang 調度器 GPM模型

Golang 調度器 GPM模型 1 多進程/線程時代有了調度器需求 在多進程/多線程的操作系統中&#xff0c;就解決了阻塞的問題&#xff0c;因為一個進程阻塞cpu可以立刻切換到其他進程中去執行&#xff0c;而且調度cpu的算法可以保證在運行的進程都可以被分配到cpu的運行時間片。這…

chatgpt:還有哪些人工智能和科技值得關注?

今天&#xff0c;很多人的目光都被ChatGPT吸引&#xff0c;其實&#xff0c;人工智能的范圍很大&#xff0c;遠不止ChatGPT或者其他自然語言的處理工具。所以說不管ChatGPT的結果如何&#xff0c;人工智能依然是未來。 那么在ChatGPT之外&#xff0c;還有沒有什么值得關注的人…

在網頁上踢球:打造我自己的python(Django)足球網站

足球不僅僅是球場上的90分鐘。它是一個不斷發展的故事&#xff0c;一個全球球迷社群的粘合劑&#xff0c;一個數據和熱情交織的世界。作為一名開發者和球迷&#xff0c;我決定將這兩大愛好結合起來&#xff0c;用 Django 打造一個足球網站&#xff0c;讓球迷們能夠追蹤他們最愛…

Unity AI生成全景圖制作天空盒

現在的AI很強大。 其中&#xff0c;有這樣一個網站&#xff0c;通過輸入提示詞&#xff0c;選擇某種風格就可以為你生成360全景圖。 網頁鏈接 一、生成全景圖 打開網頁后&#xff0c;如圖&#xff1a; 勾選&#xff0c;點擊CONFIRM。 點擊GET STARTED&#xff0c;進入主頁。…

機器人定位——里程計Odom

根據兩個車輪的輪速去估計當前的車的定位 我將提供一個更詳細完整的模型來描述兩輪差速機器人的里程計數。 我們假設機器人的兩個輪子的半徑分別為r1和r2&#xff0c;兩個輪子的轉速分別為ω1和ω2。機器人的輪距為L&#xff0c;指的是兩個輪子中心之間的距離。 首先&#x…

Git LFS配置

當你需要克隆一個包含通過 Git Large File Storage (LFS) 管理的大文件的倉庫時&#xff0c;確保 Git LFS 已經在你的系統上安裝并正確配置是很重要的。這樣&#xff0c;當你執行 git clone 命令時&#xff0c;Git LFS 跟蹤的文件也會被正確地下載。以下是在 macOS 上進行配置和…

Stable Cascade-ComfyUI中文生圖、圖生圖、多圖融合基礎工作流分享

最近 ComfyUI對于Stable Cascade的支持越來越好了一些&#xff0c;官方也放出來一些工作流供參考。 這里簡單分享幾個比較常用的基礎工作流。 &#xff08;如果還沒有下載模型&#xff0c;可以先閱讀上一篇Stable Cascade升級&#xff0c;現在只需要兩個模型&#xff09; &a…

python數據分析numpy基礎之argmax求數組最大值索引

1 python數據分析numpy基礎之argmax求數組最大值索引 python的numpy庫的argmax()函數&#xff0c;用于獲取沿指定軸的最大值的索引。 用法 numpy.argmax(a, axisNone, outNone, *, keepdims<no value>)描述 argmax()返回沿指定軸的最大值的索引。 入參axis表示指定軸…

Docker技術概論(5):Docker網絡

Docker技術概論&#xff08;5&#xff09; Docker網絡 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog…

基于QT和Visa的安捷倫(keysight)34970A溫度采集

在以前的文章中&#xff0c;描述了如何在labview開發讀取34970A儀器采集的溫度。 也描述了如何安裝keysight IO Libraries Suits. 那么本文更進一步&#xff0c;描述QT平臺c語言開發軟件&#xff0c;讀取34970A儀器采集的溫度。 以下是c代碼&#xff0c;因為采集耗費時間長&…

C++虛函數調用規則

C虛函數調用規則 基類、派生類結構&#xff1a; class Foo { public:virtual void print() {cout << "Foo" << endl;} }; class Bar : public Foo { public:virtual void print() {cout << "Bar" << endl;} };1.通過對象直接調用…

AcWing 895. 最長上升子序列(線性dp)

問題描述 給定一個長度為N NN的數列&#xff0c;求數值嚴格單調遞增的子序列的長度最長是多少。 輸入格式&#xff1a; 第一行包含整數N NN。 第二行包含N NN個整數&#xff0c;表示完整序列。 輸出格式&#xff1a; 輸出一個整數&#xff0c;表示最大長度。 數據范圍 1 ≤…

【C++提高編程】

C提高編程 C提高編程1 模板1.1 模板的概念1.2 函數模板1.2.1 函數模板語法1.2.2 函數模板注意事項1.2.3 函數模板案例1.2.4 普通函數與函數模板的區別1.2.5 普通函數與函數模板的調用規則1.2.6 模板的局限性 1.3 類模板1.3.1 類模板語法1.3.2 類模板與函數模板區別1.3.3 類模板…

備戰藍橋杯---動態規劃的一些思想1

話不多說&#xff0c;直接看題&#xff1a; 目錄 1.雙線程DP 2.正難則反多組DP 3.換個方向思考&#xff1a; 1.雙線程DP 可能有人會說直接貪心&#xff1a;先選第1條的最優路徑&#xff0c;再選第2條最優路徑。 其實我們再選第1條時&#xff0c;我們怎么選會對第2條的路徑…

FastJson中“$ref 循環引用檢測”的問題

今天在測試時&#xff0c;錯誤停留在了以下的代碼行 Object object new ObjectMapper().readValue(JSON.toJSONString(procInst.getForm()), Object.class); 報錯信息&#xff1a;com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field &quo…

linux命令行與shell腳本大全——學習筆記(1-4章)

第一章、第二章 查看運行層級 runlevel 目前有7個層級&#xff0c;3是有聯網的多用戶模式&#xff0c;5是配有GUI的多用戶模式&#xff0c;等等 第三章 啟動shell 查看/etc/passwd文件&#xff0c;可以看到每個用戶的默認shell程序&#xff0c;如: christine:x:1001:1001:…