」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 掌握pytest monkeypatch:簡化測試

掌握pytest monkeypatch:簡化測試

發佈於2025-02-09
瀏覽:805

Mastering Pytest Monkeypatch: Simplify Your Testing在python中進行測試時,確保可靠和孤立的測試至關重要。一個普遍的挑戰是如何模擬或修改測試過程中對象和功能的行為。這是Pytest monkeypatch燈具發光的地方。它提供了一種靈活的方法,可以在測試過程中動態替換代碼的部分。

在此博客中,我們將探索MonkeyPatch的力量,為什麼有用以及如何使用它來編寫乾淨,有效的測試。

什麼是monkeypatch?


functions或方法

對象的屬性

    環境變量
  • 這種動態修改是暫時的,僅適用於測試範圍,確保一旦測試結束,就可以恢復原始行為。這使得Monkeypatch對於在特定條件下嘲笑,重大依賴或測試代碼而不進行永久更改時特別有用。
  • 為什麼要使用MonkeyPatch?
以下是一些關鍵方案,其中monkeypatch可以簡化您的測試:


模擬依賴關係

:用模擬對像或函數替換外部依賴關係以測試孤立的單元。

測試邊緣案例
    :模擬邊緣案例行為,例如異常或特定的返回值。
  1. 臨時環境更改:用於測試配置特定邏輯的修改環境變量。
  2. :暫時覆蓋類或模塊的方法。
  3. 使用MonkeyPatch的示例
  4. 1。嘲笑功能
  5. 假設您的函數依賴於外部API:
  6. #my_app.py def fetch_data(): #模擬API調用 返回“真正的API響應”
在不實際調用API的情況下測試邏輯,您可以模擬fetch_data:

#test_my_app.py 來自my_app import fetch_data def test_fetch_data(monkeypatch): def mock_fetch_data(): 返回“模擬響應” monkeypatch.setAttr(“ my_app.fetch_data”,mock_fetch_data) surstert fetch_data()==“模擬響應”

2。覆蓋環境變量


想像您正在測試一個取決於環境變量的函數:

# my_app.py
def fetch_data():
    # Simulate an API call
    return "Real API Response"
#config.py 導入操作系統 def get_database_url(): 返回os.getEnv(“ database_url”,“ default_url”)


您可以使用monkeypatch模擬不同的環境:

# my_app.py
def fetch_data():
    # Simulate an API call
    return "Real API Response"
#test_config.py 從配置imimt get_database_url def test_get_get_database_url(monkeypatch): monkeypatch.setenv(“ database_url”,“模擬_url”) assert get_database_url()==“ Mocked_url”

3。嘲笑班級的方法


如果您需要臨時替換課堂中的方法:

# my_app.py
def fetch_data():
    # Simulate an API call
    return "Real API Response"
#my_class.py 類計算器: def add(self,a,b): 返回b


用模擬方法測試行為:

# my_app.py
def fetch_data():
    # Simulate an API call
    return "Real API Response"
#test_my_class.py 來自my_class導入計算器 def test_calculator_add(monkeypatch): def mock_add(self,a,b): 返回42 monkeypatch.setAttr(計算器,“ add”,mock_add) calc =計算器() assert calc.add(1,2)== 42

4。嘲笑內置功能


您甚至可以為特定方案模擬內置功能:

# my_app.py
def fetch_data():
    # Simulate an API call
    return "Real API Response"
#my_module.py def is_file_openable(文件名): 嘗試: 帶有打開(文件名,“ R”): 返回true 除了ioerror: 返回false


模擬打開以模擬不同的行為:

# my_app.py
def fetch_data():
    # Simulate an API call
    return "Real API Response"
#test_my_module.py 來自my_module import is_file_openable def test_is_file_openable(monkeypatch): def mock_open(文件名,模式): 提高ioError(“嘲笑IoError”) monkeypatch.setAttr(“ helidins.open”,mock_open) 斷言不是is_file_openable(“ test.txt”)

MonkeyPatch的最佳實踐

# my_module.py
def is_file_openable(filename):
    try:
        with open(filename, "r"):
            return True
    except IOError:
        return False
範圍

:僅在測試範圍內使用monkeypatch來避免副作用。

:為依賴性注入或其他設計模式不可行的方案保留monkeypatch。
# my_module.py
def is_file_openable(filename):
    try:
        with open(filename, "r"):
            return True
    except IOError:
        return False
使用explicit路徑
:設置屬性時,提供顯式模塊和對象路徑以防止意外修改。

    還原默認值
  1. :monkeypatch自動還原原始狀態,但避免鏈接或嵌套以保持測試簡單。
  2. 結論 通過合併此處概述的示例和最佳實踐,您可以使測試套件可靠且可維護。探索官方的Pytest文檔以了解更多信息並解鎖Pytest的全部潛力!
  3. 快樂測試!
版本聲明 本文轉載於:https://dev.to/mohamedabdelwahab/mastering-pytest-monkeypatch-simplify-your-testing-jj8?1如有侵犯,請聯繫[email protected]刪除
最新教學 更多>
  • JavaScript計算兩個日期之間天數的方法
    JavaScript計算兩個日期之間天數的方法
    How to Calculate the Difference Between Dates in JavascriptAs you attempt to determine the difference between two dates in Javascript, consider this s...
    程式設計 發佈於2025-05-01
  • 如何在Java的全屏獨家模式下處理用戶輸入?
    如何在Java的全屏獨家模式下處理用戶輸入?
    在Java 中,以全屏幕獨立模式運行Java應用程序時,通常無法按期望的工作可能無法使用JAVA應用程序時,將用戶輸入在Java ProblemPassive rendering mode allows the use of KeyListener and ActionListener inter...
    程式設計 發佈於2025-05-01
  • 如何使用“ JSON”軟件包解析JSON陣列?
    如何使用“ JSON”軟件包解析JSON陣列?
    parsing JSON與JSON軟件包 QUALDALS:考慮以下go代碼:字符串 } func main(){ datajson:=`[“ 1”,“ 2”,“ 3”]`` arr:= jsontype {} 摘要:= = json.unmarshal([] byte(...
    程式設計 發佈於2025-05-01
  • JavaScript中如何動態訪問全局變量?
    JavaScript中如何動態訪問全局變量?
    在JavaScript 一種方法是使用窗口對象存儲和檢索變量。通過引用全局範圍,可以使用其名稱動態訪問變量。 //一個腳本 var somevarname_10 = 20; //另一個腳本 window.all_vars = {}; window.all_vars ['somevarna...
    程式設計 發佈於2025-05-01
  • 版本5.6.5之前,使用current_timestamp與時間戳列的current_timestamp與時間戳列有什麼限制?
    版本5.6.5之前,使用current_timestamp與時間戳列的current_timestamp與時間戳列有什麼限制?
    在時間戳列上使用current_timestamp或MySQL版本中的current_timestamp或在5.6.5 此限制源於遺留實現的關注,這些限制需要對當前的_timestamp功能進行特定的實現。 創建表`foo`( `Productid` int(10)unsigned not ...
    程式設計 發佈於2025-05-01
  • 大批
    大批
    [2 數組是對象,因此它們在JS中也具有方法。 切片(開始):在新數組中提取部分數組,而無需突變原始數組。 令ARR = ['a','b','c','d','e']; // USECASE:提取直到索引作...
    程式設計 發佈於2025-05-01
  • 如何從Google API中檢索最新的jQuery庫?
    如何從Google API中檢索最新的jQuery庫?
    從Google APIS 問題中提供的jQuery URL是版本1.2.6。對於檢索最新版本,以前有一種使用特定版本編號的替代方法,它是使用以下語法:獲取最新版本:未壓縮)While these legacy URLs still remain in use, it is recommended ...
    程式設計 發佈於2025-05-01
  • 如何在Java中正確顯示“ DD/MM/YYYY HH:MM:SS.SS”格式的當前日期和時間?
    如何在Java中正確顯示“ DD/MM/YYYY HH:MM:SS.SS”格式的當前日期和時間?
    如何在“ dd/mm/yyyy hh:mm:mm:ss.ss”格式“ gormat 解決方案:的,請訪問量很大,並應為procectiquiestate的,並在整個代碼上正確格式不多: java.text.simpledateformat; 導入java.util.calendar; 導入java...
    程式設計 發佈於2025-05-01
  • 如何干淨地刪除匿名JavaScript事件處理程序?
    如何干淨地刪除匿名JavaScript事件處理程序?
    刪除匿名事件偵聽器將匿名事件偵聽器添加到元素中會提供靈活性和簡單性,但是當要刪除它們時,可以構成挑戰,而無需替換元素本身就可以替換一個問題。 element? element.addeventlistener(event,function(){/在這里工作/},false); 要解決此問題,請考...
    程式設計 發佈於2025-05-01
  • 表單刷新後如何防止重複提交?
    表單刷新後如何防止重複提交?
    在Web開發中預防重複提交 在表格提交後刷新頁面時,遇到重複提交的問題是常見的。要解決這個問題,請考慮以下方法: 想像一下具有這樣的代碼段,看起來像這樣的代碼段:)){ //數據庫操作... 迴聲“操作完成”; 死(); } ? > ...
    程式設計 發佈於2025-05-01
  • CSS強類型語言解析
    CSS強類型語言解析
    您可以通过其强度或弱输入的方式对编程语言进行分类的方式之一。在这里,“键入”意味着是否在编译时已知变量。一个例子是一个场景,将整数(1)添加到包含整数(“ 1”)的字符串: result = 1 "1";包含整数的字符串可能是由带有许多运动部件的复杂逻辑套件无意间生成的。它也可以是故意从单个真理...
    程式設計 發佈於2025-05-01
  • 為什麼使用Firefox後退按鈕時JavaScript執行停止?
    為什麼使用Firefox後退按鈕時JavaScript執行停止?
    導航歷史記錄問題:JavaScript使用Firefox Back Back 此行為是由瀏覽器緩存JavaScript資源引起的。要解決此問題並確保在後續頁面訪問中執行腳本,Firefox用戶應設置一個空功能。 警報'); }; alert('inline Alert')...
    程式設計 發佈於2025-05-01
  • 為什麼使用固定定位時,為什麼具有100%網格板柱的網格超越身體?
    為什麼使用固定定位時,為什麼具有100%網格板柱的網格超越身體?
    網格超過身體,用100%grid-template-columns 為什麼在grid-template-colms中具有100%的顯示器,當位置設置為設置的位置時,grid-template-colly修復了? 問題: 考慮以下CSS和html: class =“ snippet-code”> ...
    程式設計 發佈於2025-05-01
  • 為什麼我在Silverlight Linq查詢中獲得“無法找到查詢模式的實現”錯誤?
    為什麼我在Silverlight Linq查詢中獲得“無法找到查詢模式的實現”錯誤?
    查詢模式實現缺失:解決“無法找到”錯誤在銀光應用程序中,嘗試使用LINQ建立錯誤的數據庫連接的嘗試,無法找到以查詢模式的實現。 ”當省略LINQ名稱空間或查詢類型缺少IEnumerable 實現時,通常會發生此錯誤。 解決問題來驗證該類型的質量是至關重要的。在此特定實例中,tblpersoon可能...
    程式設計 發佈於2025-05-01
  • PHP陣列鍵值異常:了解07和08的好奇情況
    PHP陣列鍵值異常:了解07和08的好奇情況
    PHP數組鍵值問題,使用07&08 在給定數月的數組中,鍵值07和08呈現令人困惑的行為時,就會出現一個不尋常的問題。運行print_r($月份)返回意外結果:鍵“ 07”丟失,而鍵“ 08”分配給了9月的值。 此問題源於PHP對領先零的解釋。當一個數字帶有0(例如07或08)的前綴時,PHP...
    程式設計 發佈於2025-05-01

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3