【pytest官方文檔】解讀-開發可pip安裝的第三方插件

在上一篇的 hooks 函數分享中,開發了一個本地插件示例,其實已經算是在編寫插件了 。今天繼續跟著官方文檔學習更多知識點 。
一個插件包含一個或多個鉤子函數,pytest 正是通過調用各種鉤子組成的插件,實現了配置、搜集、運行和報告的所有方面的功能 。
通常 pytes t中的插件有如下 3 類:

  • 內置插件 : 從 pytest 內部的_pytest目錄加載
  • 外部插件 : 通過setuptools入口發現的模塊
  • conftest.py: 在測試目錄中自動發現的模塊
第一個內置插件的路徑在/Lib/site-packages/_pytest這里,有興趣的可以看下 。
第三個conftest.py我們也很熟悉了,像之前寫fixture函數以及本地hooks函數插件,都是在conftest.py中 。
第二個外部插件中提到的setuptools是什么呢?
其實這是 pytest 的一個特性庫,通過這個setuptools,我們的插件代碼可以通過pip安裝并上傳到PyPI 。
本章就來開發一個可以 pip 安裝的第三方插件
一、cookiecutter-pytest-plugin但是在開發之前,先來了解下cookiecutter-pytest-plugin這個項目 。這是官方文檔中強烈推薦的 , 可以幫助我們快速生成一個規范標準的插件項目 。
項目地址:https://github.com/pytest-dev/cookiecutter-pytest-plugin
跟著項目介紹的文檔一步步來就行 。
先安裝該項目:
$ pip install cookiecutter然后可以使用這個工具開始創建我們自己的插件項目了 。
$ cookiecutter https://github.com/pytest-dev/cookiecutter-pytest-plugin一步步跟著出現的指令提示,輸入對應的項目信息即可 。
【pytest官方文檔】解讀-開發可pip安裝的第三方插件

文章插圖
最后的輸入的一個測試插件項目是這樣的 。
【pytest官方文檔】解讀-開發可pip安裝的第三方插件

文章插圖
二、開發第三方插件重新寫一個插件,可以通過命令行,來輸出搜集到的測試用例的相關信息并保存到csv文件中去 。
可以直接在上面生成好的插件項目模板里寫我們自己的代碼 。
【pytest官方文檔】解讀-開發可pip安裝的第三方插件

文章插圖
  • 紅色文件,就是我們插件代碼的主體部分
  • 綠色部分 , 是我們自測插件代碼的地方
最后還有個重要文件setup.py,因為插件模板項目自動生成了,里面就是插件項目的相關信息,以及依賴 。
【pytest官方文檔】解讀-開發可pip安裝的第三方插件

文章插圖
1. 插件主體代碼import pytestimport csvimport repytest_plugins = 'pytester'def pytest_addoption(parser):group = parser.getgroup("testplan")group.addoption("--testplan",action="store",default=None,help="生成包含測試元數據的CSV并退出,而不運行測試")def pytest_collection_modifyitems(session, config, items):path = config.getoption('testplan')if path:with open(path, mode='w') as fd:writer = csv.writer(fd, delimiter=',', quotechar='"',quoting=csv.QUOTE_MINIMAL)writer.writerow(["title", "description", "markers"])for item in items:title = item.nodeiddescription = re.sub('\n\s+', '\n', item.obj.__doc__.strip())markers = ','.join([m.name for m in item.iter_markers()])writer.writerow([title, description, markers])pytest.exit(f"測試計劃已生成: {path}")
  • pytest_addoption: 添加命令行參數
  • pytest_collection_modifyitems: 重寫搜集用例的這個鉤子函數
主要就是把搜集到的case的標題,描述和markers這3樣寫到 csv 文件中 。
2. 測試插件代碼插件主體代碼寫好了,我們需要自測一下 。
按之前的話,可以直接把插件代碼寫到本地conftest文件里作為本地代碼直接調用測試即可 。
不過 Pytest 附帶一個名為pytester的插件,它可以幫助我們為插件代碼編寫測試 。這個插件在默認情況下是禁用的,所以在使用之前要先開啟 。
在 test 目錄下的 conftest 文件中聲明即可 。
【pytest官方文檔】解讀-開發可pip安裝的第三方插件

文章插圖
接下來上插件測試代碼,然后講解一下相關用法:
import pytestdef test_pingguo(pytester):"""Make sure that our plugin works."""pytester.makeini("""[pytest]markers =nightlyperformanceintegrationhighmediumlow""")pytester.makepyfile("""import pytest@pytest.mark.performancedef test_one():\"""test_one\"""assert False@pytest.mark.highdef test_two():\"""test_two\"""assert Truedef test_three():\"""test_three\"""assert Trueclass TestPingGuo():@pytest.mark.high@pytest.mark.performancedef test_a(self):\"""TestPingGuo.test_a,測試\"""assert Falsedef test_b(self):\"""TestPingGuo.test_b測試\"""assert True""")# run all tests with pytestresult = pytester.runpytest("--testplan=testplan.csv")

推薦閱讀