鉤子 【pytest官方文檔】解讀-插件開發之hooks 函數( 二 )


3. hook函數中的 hookwrapper回到插件代碼本身 , 也用到了一個參數hookwrapper=True

鉤子 【pytest官方文檔】解讀-插件開發之hooks 函數

文章插圖
默認情況下,我們之間重寫hook函數來徹底改變它要做的事情 , 就像插件代碼里第一個hook函數pytest_sessionstart一樣 。
hookwrapper=True時,等于是我們實現了一個hook函數的包裝器 。鉤子包裝器是一個生成器函數,它只產生一次 。
當 pytest 調用鉤子時 , 首先執行鉤子包裝器,并像常規鉤子一樣傳遞相同的參數 。
yield關鍵字大家都熟悉了 , 當代碼執行到這里的時候會暫停一下,繼續執行下一個鉤子,并且會把所有的結果或者異常封裝成一個result對象返回到yield這里 。
鉤子包裝器本身并不返回結果,只是在實際的鉤子實現的外面做一些其他的事情 。
我們的插件功能其實也并不是要修改這個鉤子本身測試報告的內容,所以就直接通過hookwrapper=True將我們的pytest_runtest_makereport寫成一個包裝好的鉤子 。
接下來就是具體功能的代碼,判斷當用例測試結果是fail,就寫到本地文件中 。
運行運行一下測試用例,看下我們插件的執行情況 。
鉤子 【pytest官方文檔】解讀-插件開發之hooks 函數

文章插圖
查看下failures.txt內容,結果正確 。
鉤子 【pytest官方文檔】解讀-插件開發之hooks 函數

文章插圖
四、鉤子函數排序/調用示例存在這樣的情況,對于同一個鉤子規范,可能會存在多個實現 。這種情況下可以使用參數tryfirsttrylast來影響鉤子的調用順序 。
# Plugin 1@pytest.hookimpl(tryfirst=True)def pytest_collection_modifyitems(items):# 盡可能早的執行...# Plugin 2@pytest.hookimpl(trylast=True)def pytest_collection_modifyitems(items):# 盡可能晚的執行...# Plugin 3@pytest.hookimpl(hookwrapper=True)def pytest_collection_modifyitems(items):# 會在上面的 tryfirst 之前執行outcome = yield# 在執行所有非鉤子包裝器之后執行具體執行順序如下:
  1. Plugin3pytest_collection_modifyitems一直調用到yield,因為它是一個鉤子包裝器 。
  2. Plugin1pytest_collection_modifyitems被調用 , 因為它被標記為tryfirst=True 。
  3. Plugin2pytest_collection_modifyitems被調用,因為它被標記為trylast=True(但即使沒有這個標記,它也會在Plugin1之后) 。
  4. Plugin3pytest_collection_modifyitems繼續在yield執行代碼,yield接收一個Result實例 。
關于hook本篇先到此 , 剩下的內容另起篇幅了 。
最后,聞道有先后,文章有遺漏,歡迎交流 。
【鉤子 【pytest官方文檔】解讀-插件開發之hooks 函數】

推薦閱讀