在上一篇的 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
這個專案。這是官方檔案中強烈推薦的,可以幫助我們快速生成一個規範標準的外掛專案。
專案地址:https://github.com/pytest-dev/cookiecutter-pytest-plugin
跟著專案介紹的檔案一步步來就行。
先安裝該專案:
$ pip install cookiecutter
然後可以使用這個工具開始建立我們自己的外掛專案了。
$ cookiecutter https://github.com/pytest-dev/cookiecutter-pytest-plugin
一步步跟著出現的指令提示,輸入對應的專案資訊即可。
最後的輸入的一個測試外掛專案是這樣的。
重新寫一個外掛,可以通過命令列,來輸出蒐集到的測試用例的相關資訊並儲存到csv
檔案中去。
可以直接在上面生成好的外掛專案模板裡寫我們自己的程式碼。
紅色檔案
,就是我們外掛程式碼的主體部分綠色部分
,是我們自測外掛程式碼的地方最後還有個重要檔案setup.py
,因為外掛模板專案自動生成了,裡面就是外掛專案的相關資訊,以及依賴。
import pytest
import csv
import re
pytest_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.nodeid
description = 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 檔案中。
外掛主體程式碼寫好了,我們需要自測一下。
按之前的話,可以直接把外掛程式碼寫到本地conftest
檔案裡作為原生程式碼直接呼叫測試即可。
不過 Pytest 附帶一個名為pytester
的外掛,它可以幫助我們為外掛程式碼編寫測試。這個外掛在預設情況下是禁用的,所以在使用之前要先開啟。
在 test 目錄下的 conftest
檔案中宣告即可。
接下來上外掛測試程式碼,然後講解一下相關用法:
import pytest
def test_pingguo(pytester):
"""Make sure that our plugin works."""
pytester.makeini(
"""
[pytest]
markers =
nightly
performance
integration
high
medium
low
"""
)
pytester.makepyfile(
"""
import pytest
@pytest.mark.performance
def test_one():
\"""test_one\"""
assert False
@pytest.mark.high
def test_two():
\"""test_two\"""
assert True
def test_three():
\"""test_three\"""
assert True
class TestPingGuo():
@pytest.mark.high
@pytest.mark.performance
def test_a(self):
\"""
TestPingGuo.test_a,測試
\"""
assert False
def test_b(self):
\"""
TestPingGuo.test_b
測試
\"""
assert True
"""
)
# run all tests with pytest
result = pytester.runpytest("--testplan=testplan.csv")
這裡最重要的就是pytester
提供的方法,比如上面用到的:
pytester.makeini
:因為我的測試case上加了不同的 marker,這些是需要註冊在 ini 檔案裡的pytester.makepyfile
: 這裡就是寫的測試用例程式碼了其實就是在對應的方法裡,寫上我們的原生程式碼,只是需要被""" """
包起來,當做字串,然後 pytest 會自行解析我們的程式碼,在臨時目錄裡建立對應的檔案然後執行。
不僅如此,還可以建立其他的檔案,比如conftest
。這是原始碼,有興趣的可以進去一探究竟。
pytester.runpytest("--testplan=testplan.csv")
這裡可以新增要執行的命令列引數。
執行測試
直接執行測試程式碼,看下結果。
注意我這裡的檔案也是被生成在了臨時目錄裡,開啟控制檯輸出的路徑就可以找到。
開啟 csv 檔案驗證一下結果,輸出正確。
回到專案根目錄,命令列輸入:
python setup.py sdist build
完成後會生成dist
目錄,下面就有對應的包。
沒有賬號的要先註冊登入一下,記得要去對應填寫的郵箱裡點選啟用認證才可以。
接著安裝twine
,我能使用這個工具來上傳。
pip install twine
安裝完成後就可以執行了上傳:
twine upload dist/*
提示需要輸入註冊的賬號和密碼,最後完成上傳。
上傳完成後就可以在pypi中開啟自己的外掛主頁了,現在其他小夥伴也可以安裝外掛了。