pytest hook - 我的用例我做主

2021-12-12 光榮之路

文 | Blazer

來源|微信公眾號 Qtest之道

pytest是一個基於python、功能強大的測試框架,很多項目會採用該框架維護測試用例。pytest除了強大的用例發現、收集、執行和報告輸出之外,還提供了豐富的函數hook可以自定義插件或者框架行為,只需在項目目錄/conftest.py文件中實現對應hook名稱的函數,即可完成hook函數的註冊。

下面來為大家介紹一下pytest中常用hook都有哪些

引導型hook引導型hook僅在內部或setuptools安裝的插件中才會調用pytest_load_initial_conftests(early_config, parser, args)
實現了在命令行參數解析之前調用conftest文件pytest_cmdline_parse(pluginmanager, args)
解析指定參數並返回初始化的配置對象,返回第一個非None結果後停止調用後續實現pytest_cmdline_main(config)
用於執行命令行指令。默認實現中會調用配置hook和測試運行的主循環初始化型hook初始化型hook主要在插件和conftest.py文件中調用pytest_addoption(parser)
註冊argparse風格的選項和ini配置風格的配置值,在測試開始時調用一次。註冊的值在config獲取到,而config可以通過很多內部對象的.config屬性獲取,或者使用pytestconfig夾具來獲取pytest_addhooks(pluginmanager)
在插件註冊時調用以添加新的hook,其可被其他插件實現用以改變本插件或者同本插件交互pytest_configure(config)
在命令行參數解析完成之後,以及插件和conftest文件加載之前調用。用於插件和conftest文件執行初始化操作。pytest_unconfigure(config)
測試進程退出之前調用pytest_sessionstart(session)
在Session對象創建之後,執行運行收集之前調用pytest_sessionfinish(session, exitstatus)
在測試運行結束之後,返回退出碼之前調用測試運行hookpytest_runtestloop(session)
調用以開始運行測試用例循環pytest_runtest_protocol(item, nextitem)
用於實現runtest_setup/call/teardown協議,包括收集異常和調用報告hookpytest_runtest_logstart(nodeid, location)
在用例setup之前調用pytest_runtest_logfinish(nodeid, location)
在用例teardown之後調用pytest_runtest_setup(item)
在用例執行之前調用pytest_runtest_call(item)
調用以執行用例pytest_runtest_teardown(item, nextitem)
在用例執行完成後調用pytest_runtest_makereport(item, call)
在runtest_setup/call/teardown之後執行,用於返回當前運行的結果用例收集hookpytest_collection(session)
在用例收集之前調用,用於在指定的session上收集用例pytest_ignore_collect(path, config)
返回True則不會收集當前路徑下的用例,所有文件/目錄開始收集前均會調用該hook查詢是否繼續pytest_collect_directory(path, parent)
在遍歷目錄中文件之前調用pytest_collect_file(path, parent)
返回Node或者None作為收集的用例pytest_pycollect_makeitem(collector, name, obj)
為模塊中的python對象返回自定義用例pytest_generate_tests(metafunc)
生成參數化的用例pytest_make_parametrize_id(config, val, argname)
生成自定義的參數化用例idpytest_collection_modifyitems(session, config, items)
用例收集完成之後,可用來添加、刪除或者排序收集好的用例報告型hookpytest_collectstart(collector)
用例開始收集之前pytest_itemcollected(item)
收集一個用例之後pytest_collectreport(report)
收集完成之後pytest_deselected(items)
通過關鍵字刪除用例pytest_report_header(config, startdir)
定義報告標題pytest_report_collectionfinish(config, startdir, items)
定義顯示在"collected X items"之後的文字pytest_report_teststatus(report)
設置用例測試結果、錯誤信息和狀態信息pytest_terminal_summary(terminalreporter, exitstatus)
用於設置測試總結信息(運行完成後最後一行的 "X failed, Y passed")pytest_fixture_setup(fixturedef, request)
執行夾具的setup操作,返回結果會作為對應夾具的輸入pytest_fixture_post_finalizer(fixturedef, request)
在夾具teardown,cache清空前執行pytest_runtest_logreport(report)
在測試setup/call/teardown之後執行,可以用於自定義相關信息pytest_assertrepr_compare(config, op, left, right)
定義出錯斷言的解釋信息debug/交互型 hookpytest_internalerror(excrepr, excinfo)
發生內部錯誤時調用pytest_keyboard_interrupt(excinfo)
鍵盤中斷時調用pytest_exception_interact(node, call, report)
拋出異常時調用pytest_enter_pdb(config)
進入pdb之前調用hook 聲明周期示意圖:

應用示例:
比如需要收集用例錯誤信息,並在測試完成後存入資料庫。那麼就可以在pytest_runtest_logreport中保存錯誤信息至全局變量,並在pytest_sessionfinish中(測試完成後)將對應的信息保存至資料庫即可最後

通過pytest強大的hook可以定製很多自己需要的功能,通用型的功能還可以製作為插件。

👆單擊連結直達、長按諮詢吳老師或公眾號內回復「2」

無論上課或自學,

你首先需要準備:

每天 2 小時+的學習時間,

每天堅持寫代碼的習慣!

有投入才有產出,

10k+的漲幅需要 1 年以上的努力!

祝你成功!

光榮之路出品

測試大佬和小白的故事

招聘QQ群:203715128

相關焦點

  • Pytest進階:Hook函數的使用技巧
    ' 添加到 pytest 配置中") parser.addoption("--flag", action="store_true", default=False, help="將布爾參數 '--flag' 添加到 pytest 配置中")@pytest.fixture(scope='function')def
  • Pytest測試框架系列 - 自動化測試中用例執行失敗後自動提交缺陷!
    import hookimpl@hookimpl(hookwrapper=True)def pytest_runtest_makereport(item, call): out = yield report = out.get_result() print("當前有哪些方法", report.
  • Pytest測試用例之setup與teardown方法(二)
    續 日常積累 | 初識Pytest  | 日常積累 | 初識pytest (二) | Pytest測試用例之setup與teardown方法(一
  • Python測試框架pytest
    將運行用 @pytest.mark.login 裝飾器修飾的所有測試3.2.9、-x用例運行失敗則立即停止執行3.2.10、-k運行包含關鍵字的用例pytest -v -k "one" 文件名.py執行測試用例名稱包含 one 的所有用例
  • 高效測試必學 | 用pytest生成測試報告!
    https://github.com/pytest-dev/pytest-html與安裝python第三方庫一樣使用pip命令->pip install pytest-html,我這邊是已經安裝好了的,所以你看到的輸出信息可能和我的不太一樣。使用pip list 可以查看是否有pytest-html,如果有表示已經安裝成功。
  • 人人都能看懂的 Pytest 簡易上手指南!
    ===================== 1 failed in 0.04s ===========================================================================================================如果還沒有安裝pytest,可以使用 pip install pytest 安裝。
  • 實戰 | 接口自動化測試框架開發(Pytest+Allure+AIOHTTP+用例自動生成)
    於是繼續思考,思考的結果是其實我可以把整個事情分為兩部分;第一部分,讀取 yaml 測試用例,HTTP 請求測試接口,收集測試數據。第二部分,根據測試數據,動態生成 pytest 認可的測試用例,然後執行,生成測試報告。這樣一來,兩者就能完美結合了,也完美符合我所做的設想。接著就來實現它。
  • Pytest中斷言的重要性,就不需要我重複了吧
    出品 | 51Testing軟體測試網前言 我們在寫自動化的過程中,用例的斷言也是至關重要的,斷言可以幫助我們判斷用例測試點是否成功和失敗。當然在我們這麼強大的Pytest框架中,斷言也是比較強大的。為什麼?繼續往下看 。
  • python pytest接口自動化框架搭建
    pytest2.編寫單測用例在pytest框架中,有如下約束:所有的單測文件名都需要滿足test_*.py格式或*_test.py格式。(下邊我講解具體詳情)  6. 4 fail,1passed in 0.06 seconds======    表示通過的數量,沒有通過也會總結數量 ,以及花費得時間.5.使用命令行選項有了命令行選項使其操作我們的用例變的非常靈活。
  • Pytest的基本應用(一)
    但是前提是需要安裝pytest,它是屬於第三方的庫,安裝的命令為:                   pip  install pytest          在這裡先寫一個函數的測試代碼,來說明pytest的應用,創建f.py的模塊,在裡面編寫以test開頭的測試代碼,然後在該目錄下執行pytest,發現測試代碼並沒有執行,見如下截圖
  • Python 測試框架unittest和pytest的優劣
    3)測試方法必須以「test_」開頭4)測試類必須要有unittest.main()方法1)測試文件名必須以「test_」開頭或者"_test"結尾(如:test_ab.py)2)測試方法必須以「test_」開頭3)測試類命名以"Test"開頭用例分類執行默認執行全部用例,也可以通過加載testsuit,執行部分用例可以通過@pytest.mark
  • pytest「conftest、pytest參數化、重運行、出測試報告」
    為什麼命令行當中提示我引入失敗呢?那是因為這個地方沒有創建成包的形式,一定要以Python包的形式創建:二、pytest參數化pytest當中不能使用ddt。流程性質的東西,在pytest裡面叫做參數化。
  • python的pytest框架之命令行參數詳解(上)
    其實不然,pytest 還提供了很多可供我們執行用例的命令行參數,下面我們就一一介紹並演示1.-v  :pytest -v 說明:可以輸出用例更加詳細的執行信息,比如用例所在的文件及用例名稱等-m  :pytest -m 」標記「 說明:執行特定的測試用例。
  • Python測試框架之pytest(一)
    /report.html','test_login.py'])【執行test_login.py文件,並生成html格式的報告】main()括號內可傳入執行參數和插件參數,通過[]進行分割,[]內的多個參數通過『逗號,』進行分割運行目錄及子包下的所有用例 pytest.main(['目錄名'])運行指定模塊所有用例 pytest.main(['test_reg.py'])
  • Pytest系列(6) - conftest.py的詳細講解
    conftest.py的出現,就是為了解決上述問題,單獨管理一些全局的fixture conftest.py配置fixture注意事項pytest會默認讀取conftest.py裡面的所有fixtureconftest.py 文件名稱是固定的,不能改動conftest.py只對同一個package下的所有測試用例生效不同目錄可以有自己的
  • Pytest之並發執行(十四)
    不管是UI自動化測試用例還是API的自動化測試用例,在編寫的使用都需要注意每個測試用例執行的獨立性,也就是說編寫的每個測試用例都是互相不依賴的
  • pytest系列——Hook函數的使用
    pytest_collectstart(collector: Collector) 收集器開始收集。pytest_make_collect_report(collector: Collector) 執行collector.collect()並返回一個CollectReport。
  • python自動化測試之pytest框架
    pytest測試框架也是主流的一個測試框架,想比於unnitest框架來說,其不需要像unittest那樣單獨創建類繼承unittest.TestCase,而只需要創建測試類或者測試文件,然後以test開頭,pytest可以按照這個規則找到測試用例並執行。
  • pytest---setup和teardown簡單用法
    前言  使用過unittest的小夥伴們都知道,setup和teardown是用來處理用例的開始前工作和結束後的工作,其中還有setupclass和teardownclass是保證執行所以的用例都只執行1次前置和後置,使用起來非常方便,那麼學習pytest強大的測試框框,肯定也有這個功能,並且還比unittest的簡單不少。
  • Pytest丨如何使用全功能的Python測試框架?小白必看
    關注我,每周分享軟體測試技術乾貨、面試經驗,想要進入軟體測試學習交流群的可以直接私信我哦~~我們在寫自動化的過程中,用例的斷言也是至關重要的,斷言可以幫助我們判斷用例測試點是否成功和失敗。當然在我們這麼強大的pytest框架中,斷言也是比較強大的。為什麼?繼續往下看。