Python裝飾器decorators和pytest夾具fixture詳解和使用

此前一直認為fixture就叫python中的裝飾器,學習后才發現decorators才是裝飾器,fixture是pytest框架的夾具,只是通過裝飾器去定義和使用。所以要了解fixture就得先了解python裝飾器。

一、裝飾器(decorators)

1.定義

裝飾器(decorators)是 Python 中的一種高級功能,允許動態地修改函數或類的行為。裝飾器是一種函數 ,它接受一個函數作為參數,并返回一個新的函數或修改原來的函數。
在這里插入圖片描述

2.使用場景

日志記錄(函數的調用信息、參數、返回值)、性能分析(函數執行時間)、權限控制(函數訪問權限)、緩存(函數結果緩存)

3.裝飾器使用方法

我采用一個方法來寫清楚它的使用方法以及對參數的接收處理,按步驟查看注釋

1)基本語法

#1.聲明裝飾器函數new_function,用original_function接收原始函數old_function
def new_function(original_function):#3.聲明一個inner_function方法---接受原始函數的參數并進行處理。#*args表示接收任意數量的位置參數--非關鍵字參數,并打包成一個元組。#**kwarg表示接收任意數量的關鍵字參數--如key=value,并打包成一個字典。#兩種方式作用為了兼容所有傳進來的參數類型def inner_function(*args, **kwargs):# 4.調用原始函數前添加的新操作print("添加的前置操作,對關鍵字參數進行處理")#對關鍵字參數處理--元組不支持修改print("傳進來的元組參數:",args)print("傳進來的關鍵字參數:",kwargs)kwargs["a"]=10# 5.將修改后的參數傳回result = original_function(*args, **kwargs)# 6.調用原始函數后添加的新操作print("添加的后置操作")return result#7.返回新函數inner_functionreturn inner_function#8.使用裝飾器@new_function,現在調用的函數實際是處理后的新函數
#等同于old_function= new_function(old_function)
@new_function
#2.聲明原始函數old_function
def old_function(arg1,arg2,a=None):print("原始函數")print("修改過后的a:",a)#9.帶參數調用函數
old_function(1, 3, a=4)

執行結果:
在這里插入圖片描述
多個裝飾器裝飾方法時,會依次調用。

2)內置裝飾器
除了裝飾方法以外,裝飾器還可以裝飾類。Python 提供了一些內置的裝飾器,例如:
@staticmethod: 將方法定義為靜態方法,不需要實例化類可直接調用。
@classmethod: 將方法定義為類方法,第一個參數是類本身(通常命名為 cls)。
@property: 將方法轉換為屬性,使其可以像屬性一樣訪問。

二、fixture夾具

如果理解了裝飾器是什么,就不難理解fixture夾具了。在pytest測試框架中,夾具(fixture–英文釋義固定器械)是一種用于為測試用例提供預置環境或共享資源的機制。個人理解fixture就是pytest封裝好了的一個裝飾器函數名稱----@pytest.fixture。既然fixture是封裝好的,那一定有指定的參數和調用方法。

1.fixture的參數

在這里插入圖片描述
如上圖封裝好的fixture方法可見,fixture有五種傳參:

#實例用法
@pytest.fixture(scope='',autouse='',params="",ids="",name="")

1)scope—fixture的作用范圍,一共有四種
function(函數級):每一個函數或方法都會調用
class(類級別):每個測試類只運行一次
module(模塊級):每一個.py文件調用一次
package(包級):每一個python包只調用一次(暫不支持)
session(會話級):每次會話只需要運行一次,會話內所有方法及類,模塊都共享這個方法
執行優先級:session > module > class > function

這個地方先不舉例,和2聯合起來舉例,通過2的示例,將會很清楚scope的執行過程

2)autouse—是否自動執行
默認為False,設置為True后設置的執行范圍scope里面包含的所有用例都會執行這個方法。不用再手動在每個要裝飾的方法上使用@pytest.mark.usefixture(“fixturename”)。
示例代碼:

import logging
import pytest
from allure_commons import fixture# 會話級別的 fixture - 整個測試運行期間只執行一次
@pytest.fixture(scope="session", autouse=True)
def session_fixture():print("\n===== session 范圍 fixture 開始 (整個測試會話只執行一次) =====")yieldprint("\n===== session 范圍 fixture 結束 (所有測試完成后執行) =====")# 模塊級別的 fixture - 每個測試模塊只執行一次
@pytest.fixture(scope="module", autouse=True)
def module_fixture():print("\n***** module 范圍 fixture 開始 (每個.py文件只執行一次) *****")yieldprint("\n***** module 范圍 fixture 結束 (文件所有測試完成后執行) *****")# 類級別的 fixture - 每個測試類執行一次
@pytest.fixture(scope="class", autouse=True)
def class_fixture():print("\n------ class 范圍 fixture 開始 (每個測試類只執行一次) ------")yieldprint("\n------ class 范圍 fixture 結束 (類中所有測試完成后執行) ------")# 函數級別的 fixture - 每個測試函數執行一次
@pytest.fixture(scope="function", autouse=True)
def function_fixture():print("\n>>>>>> function 范圍 fixture 開始 (每個測試方法執行一次) >>>>>>")yieldprint("\n<<<<<< function 范圍 fixture 結束 (每個測試方法完成后執行) <<<<<<")def test_outside_class():print("執行類外的測試函數")assert Trueclass TestClass:def test_case1(self):print("執行test_case1")assert Truedef test_case2(self):print("執行test_case2")assert True

執行打印:
在這里插入圖片描述
3)params—參數
示例代碼:

import pytest@pytest.fixture(scope="function",params=[1,2,3,4])
#固定寫法用request表示參數
def function_fixture(request):#固定寫法提取參數yield request.param#這里用注釋來使用裝飾器
@pytest.mark.usefixtures("function_fixture")
def test_param():print("test")

運行結果:
在這里插入圖片描述

4)ids—給params參數每一個值設置變量名
上述params示例中,可以看到傳入了參數1、2、3、4。但是沒有參數名稱,不太方便去使用。這個ids就是給參數設置變量名。
示例代碼:

import pytest@pytest.fixture(scope="function",params=[1,2,3,4],ids=['p1','p2','p3','p4'])
#固定寫法用request表示參數
def function_fixture(request):#固定寫法提取參數yield request.param#直接在測試函數參數中聲明fixture名稱來獲取參數
def test_param(function_fixture):print(f"當前參數值: {function_fixture}")print("test")

運行結果:
在這里插入圖片描述
5)name–給fixture標記的方法取別名
例如以上的function_fixture我給它起名為fixname
示例代碼:

import pytest@pytest.fixture(scope="function",params=[1,2,3,4],ids=['p1','p2','p3','p4'],name="fixname")
#固定寫法用request表示參數
def function_fixture(request):#固定寫法提取參數yield request.param#直接在測試函數參數中聲明fixture名稱來獲取參數
def test_param(fixname):print(f"當前參數值: {fixname}")print("test")

運行結果:
在這里插入圖片描述

2.fixture配置conftest.py使用

上述代碼中是在每個測試用例py中定義的fixture,測試過程中會有很多通用的操作,豈不是每個用例中都要定義一遍,這里就用到了conftest.py來管理。
conftest.py主要作用是用于定義和共享測試配置、Fixture以及其他測試相關的設置、避免重復代碼,提高測試代碼的可維護性和可重用性,使測試代碼本身更專注于測試邏輯—簡單的說就是可以跨測試用例共享數據和資源,對測試前后的配置和數據處理等操作
注:和conftest.py同一目錄以及子目錄的測試均可使用其中裝飾器。

示例代碼:
test_conf.py

import pytestdef test_conf():print("測試conftest.py文件,即使這里沒有使用fixture也會調用!!")

conftest.py

import pytest@pytest.fixture(scope="function", autouse=True)
def function_fixture():print("\n>>>>>> function 范圍 fixture 開始 (每個測試方法執行一次) >>>>>>")yieldprint("\n<<<<<< function 范圍 fixture 結束 (每個測試方法完成后執行) <<<<<<")

目錄結構:
在這里插入圖片描述
運行結果:
在這里插入圖片描述
通常配合conftest.py用的還有鉤子hook函數。

三、總結

1、decorators裝飾器是一種函數 ,它接受一個函數作為參數,并返回一個新的函數或修改原來的函數。----個人理解裝飾器就是封裝好了一個函數,然后采用"@函數名稱()"來注釋另一個函數以使用該裝飾器,達到某些目的。
2、fixture測試夾具,本質上是一個函數,為測試提供可重用的環境支持。用@pytest.fixture()裝飾器將一個函數標記為pytest可識別的fixture夾具。
3、可以用conftest.py來管理共享的裝飾器。

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

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

相關文章

目標檢測之YOLOv5到YOLOv11——從架構設計和損失函數的變化分析

YOLO&#xff08;You Only Look Once&#xff09;系列作為實時目標檢測領域的標桿性框架&#xff0c;自2016年YOLOv1問世以來&#xff0c;已歷經十余年迭代。本文將聚焦YOLOv5&#xff08;2020年發布&#xff09;到YOLOv11&#xff08;2024年前后&#xff09;的核心技術演進&am…

leetcode:面試題 08.06. 漢諾塔問題

題目鏈接 面試題 08.06. 漢諾塔問題 題目描述 題目解析 當只有一個盤子時&#xff1a;直接從A柱放到C柱即可。當有兩個盤子時&#xff1a;將A柱第一個盤子先放到B柱&#xff0c;再將A柱第二個盤子放到C柱&#xff0c;最后將B柱上的盤子放到C柱子。當有3個盤子時&#xff1a;先…

mybatis-plus一對多關聯查詢

MyBatis-Plus 本身主要關注單表操作&#xff0c;但可以通過幾種方式實現一對多關聯查詢&#xff1a; 1. 使用 XML 映射文件實現 這是最傳統的方式&#xff0c;通過編寫 SQL 和 ResultMap 實現&#xff1a; <!-- UserMapper.xml --> <resultMap id"userWithOrd…

一些想法。。。

1.for里面的局部變量這種還是在for里面定義比較好 比如 for(int i 0;i<n;i){ int num; cin>>num; } 實不相瞞&#xff0c;有一次直接cin了i怎么都沒看出來哪里錯了。。。 2.關于long long 如果發現中間結果大約是10^9&#xff0c;就要考慮int 溢出 即用 long …

遷移科技拆垛工業相機:驅動智能拆碼垛革命,賦能工業自動化新紀元

——將復雜技術轉化為可感知價值&#xff0c;引領行業標桿級解決方案 作為工業自動化領域的品牌策略專家&#xff0c;我深知企業面臨的痛點&#xff1a;拆垛環節效率低下、人工成本高、安全隱患頻發。遷移科技憑借其領先的3D視覺技術&#xff0c;通過拆垛工業相機將抽象參數轉…

Linux筆記---線程控制

1. 線程創建&#xff1a;pthread_create() pthread_create() 是 POSIX 線程庫&#xff08;pthread&#xff09;中用于創建新線程的函數。調用該函數后系統就會啟動一個與主線程并發的線程&#xff0c;并使其跳轉到入口函數處執行。 #include <pthread.h>int pthread_cr…

Ragflow 源碼:ragflow_server.py

目錄 介紹1. 初始化和配置2. 數據庫管理3. 核心功能4. HTTP 服務5. 信號處理6. 調試支持 流程圖系統架構 代碼解釋1. **初始化系統**2. **運行時控制**3. **核心服務** 介紹 ragflow_server.py 是 RAGFlow 項目的主服務器程序&#xff0c;負責啟動和管理 RAGFlow 的核心服務。…

springboot企業級項目開發之項目測試——單元測試!

項目測試 項目測試是對項目的需求和功能進行測試&#xff0c;由測試人員寫出完整的測試用例&#xff0c;再按照測試用例執行測試。項目測試是項目質量的保證&#xff0c;項目測試質量直接決定了當前項目的交付質量。 測試人員在開展測試之前&#xff0c;首先需要進行測試的需…

Linux kdump遠程轉存儲配置手冊教程

一、前言 kdump是一個Linux內核崩潰轉儲機制,當系統崩潰時,它可以捕獲內核的內存轉儲信息,幫助分析崩潰原因。將轉儲文件存儲到遠程位置,便于集中管理和分析。本教程將詳細介紹如何配置kdump將轉儲文件遠程轉存儲。 二、安裝kdump 在大多數Linux發行版中,kdump相關的工…

c++bind和forward完美轉化

前言 1. std::bind概述 std::bind是C11引入的功能模板&#xff0c;位于<functional>頭文件中&#xff0c;用于將函數、成員函數或函數對象與特定參數綁定&#xff0c;生成一個新的可調用對象。 1.1 基本用法 #include <iostream> #include <functional>v…

【Dify精講】第14章:部署架構與DevOps實踐【知識卡片】

第14章&#xff1a;部署架構與DevOps實踐http://www.airinto.com/share/49997bb7 一、Docker 容器化方案&#xff1a;從開發到生產的統一 二、Kubernetes 部署&#xff1a;走向云原生 三、CI/CD 流程設計&#xff1a;自動化的藝術 四、高可用架構&#xff1a;讓 AI 服務永不停歇…

el-cascader 設置可以手動輸入也可以下拉選擇

el-cascader 設置可以手動輸入也可以下拉選擇 稍微修改一下就可食用 <template slot"stationId" slot-scope""><div style"position: relative;"><!-- 可輸入也可顯示選項 --><el-input:value"stationNameInput"…

Unity Shader開發-著色器變體(1)-著色器變體概述

有時我們希望一份 Shader 源代碼可能滿足多種功能&#xff08;如處理法線貼圖、自發光、不同光照模式、陰影&#xff0c;支持GPUInstacing等多種功能&#xff09;。所以我們需要能夠實現Shader分支的方法。 一.Shader分支實現 主要有三種手段實現Shader分支&#xff1a; 1.靜…

ECK 簡化:在 GCP GKE Autopilot 上部署 Elasticsearch

作者&#xff1a;來自 Elastic Eduard Martin 學習如何使用 GKE Autopilot 和 ECK 在 GCP 上部署 Elasticsearch 集群。 想要獲得 Elastic 認證&#xff1f;了解下一次 Elasticsearch Engineer 培訓的時間&#xff01; Elasticsearch 擁有豐富的新功能&#xff0c;可以幫助你為…

測試一個軟件的性能有哪些指標?

在測試軟件性能時,通常會關注多個維度的指標,以評估系統在不同負載下的表現。以下是關鍵的性能測試指標分類和詳細說明: ?? 核心性能指標分類 1. 響應時間(Response Time) 定義:從發送請求到接收到響應所花費的時間 細分: 平均響應時間:所有請求的平均耗時 *P90/P95…

淺析std::atomic<T>::compare_exchange_weak和std::atomic<T>::compare_exchange_strong

目錄 std::atomic ::compare_exchange_weak 和 std::atomic ::compare_exchange_strong 核心原理 函數簽名 核心區別 典型用法 1. compare_exchange_weak&#xff08;循環內重試&#xff09; 2. compare_exchange_strong&#xff08;單次嘗試&#xff09; 底層機制 總…

舉出一個異步接口測試的例子

以下是一個完整的 ?異步接口測試? 實際案例&#xff0c;包含問題場景、解決方案、代碼實現和面試回答技巧&#xff0c;適合在面試中展示技術深度&#xff1a; ?案例背景? ?業務場景?&#xff1a; 測試一個AI圖片生成平臺的異步接口&#xff0c;用戶提交生成請求后&#…

更新麒麟連不上外網

問題&#xff1a;更新麒麟連不上外網 處理&#xff1a;本地建個下載地址 建立文件夾/root/x86.rpm&#xff0c;子文件夾&#xff1a;Packages、repodata&#xff0c;和在線站點建的一樣&#xff1a;Index of /NS/V10/V10SP1.1/os/adv/lic/base/x86_64/&#xff0c;然后就下載…

TensorFlow深度學習實戰——使用Hugging Face構建Transformer模型

TensorFlow深度學習實戰——使用Hugging Face構建Transformer模型 0. 前言1. 安裝 Hugging Face2. 文本生成3. 自動模型選擇和自動分詞4. 命名實體識別5. 摘要生成6. 模型微調相關鏈接 0. 前言 除了需要實現特定的自定義結構&#xff0c;或者想要了解 Transformer 工作原理外&…

SAP-ABAP:SAP全模塊的架構化解析,涵蓋核心功能、行業方案及技術平臺

一、核心業務模塊&#xff08;Logistics & Operations&#xff09; 模塊代號核心功能典型流程關鍵事務碼物料管理MM采購/庫存/發票校驗采購到付款 (P2P)ME21N&#xff08;采購訂單&#xff09;, MI31&#xff08;庫存盤點&#xff09;銷售與分銷SD訂單/定價/發貨/開票訂單…