在python中進行測試時,確保可靠和孤立的測試至關重要。一個普遍的挑戰是如何模擬或修改測試過程中對象和功能的行為。這是Pytest monkeypatch燈具發光的地方。它提供了一種靈活的方法,可以在測試過程中動態替換代碼的部分。
什麼是monkeypatch?
對象的屬性
測試邊緣案例
想像您正在測試一個取決於環境變量的函數:
# 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”
如果您需要臨時替換課堂中的方法:
# 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
您甚至可以為特定方案模擬內置功能:
# 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來避免副作用。
# my_module.py def is_file_openable(filename): try: with open(filename, "r"): return True except IOError: return False使用explicit路徑
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3