目錄:
- 安裝及入門
- 使用和調用方法
- 原有TestSuite使用方法
- 斷言的編寫和報告
- Pytest fixtures:清晰 模塊化 易擴展
- 使用Marks標記測試用例
- Monkeypatching/對模塊和環境進行Mock
- 使用tmp目錄和文件
- 捕獲stdout及stderr輸出
- 捕獲警告信息
- 模塊及測試文件中集成doctest測試
- skip及xfail: 處理不能成功的測試用例
- Fixture方法及測試用例的參數化
- 緩存: 使用跨執行狀態
- unittest.TestCase支持
- 運行Nose用例
- 經典xUnit風格的setup/teardown
- 安裝和使用插件
- 插件編寫
- 編寫鉤子(hook)方法
- 運行日志
- API參考
- 優質集成實踐
- 片狀測試
- Pytest導入機制及sys.path/PYTHONPATH
- 配置選項
- 示例及自定義技巧
- Bash自動補全設置
Monkeypatching,對模塊和環境進行Mock
有時,測試需要調用依賴于全局設置的功能,或調用無法輕松測試的代碼(如網絡訪問)。 monkeypatch fixture可幫助您安全地設置/刪除屬性,字典項或環境變量,或修改sys.path以進行導入。 請參閱monkeypatch博客文章,了解一些介紹材料并討論其動機。
簡單示例: 猴子補丁方法
如果你想阻止os.expanduser
返回某個目錄,你可以在測試方法調用其之前,使用monkeypatch.setattr()
方法改造這個函數:
# test_module.py文件內容
import os.path
def getssh(): # 偽應用代碼
return os.path.join(os.path.expanduser("~admin"), '.ssh')
def test_mytest(monkeypatch):
def mockreturn(path):
return '/abc'
monkeypatch.setattr(os.path, 'expanduser', mockreturn)
x = getssh()
assert x == '/abc/.ssh'
這里在我們的測試方法中,使用猴子補丁改造了os.path.expanduser
, 然后再進行調用。 測試執行完成后對os.path.expanduser
修改將被撤消。
示例:阻止"requests"庫的遠程操作
如果要阻止"requests"庫在所有測試中執行http請求,你可以執行以下操作:
# conftest.py文件內容
import pytest
@pytest.fixture(autouse=True)
def no_requests(monkeypatch):
monkeypatch.delattr("requests.sessions.Session.request")
每個測試方法執行時都會自動使用該fixture,它將刪除測試方法內置屬性中的request.session.Session.request
,以便在測試中任何使用requests庫創建http請求的用例都將失敗。
注意:
不建議使用猴子補丁改造Python內置函數,如open,compile等,因為它可能會破壞pytest的內部邏輯。 如果必須要使用,你可以通過參數:--tb = native
,- tables = plain
和--capture = no
來試試,不一定不會有問題。
注意:
改造stdlib
函數和pytest依賴的某些第三方庫本身可能會破壞pytest,因此在這些情況下,建議使用MonkeyPatch.context()
來改造這些模塊:
import functools
def test_partial(monkeypatch):
with monkeypatch.context() as m:
m.setattr(functools, "partial", 3)
assert functools.partial == 3
查看#3290號bug詳情
API參考
查閱MonkeyPatch類相關文檔。