軟件測試 | Pytest測試框架之插件開發(fā)
簡介
pytest 給我們開放了大量的 hook 函數(shù),可以編寫插件。
pytest 插件類型
pytest 可以識別到三種插件:
內(nèi)置插件:從 pytest 內(nèi)部 _pytest 目錄加載的插件
外部插件:通過 pip 安裝的插件(比如: pip install pytest-ordering )。
conftest.py 插件:測試目錄中的 conftest.py 加載
pytest hook 函數(shù)
pytest hook 鏈接:?https://docs.pytest.org/en/stable/reference.html?#hooks
pytest hook 函數(shù)也叫鉤子函數(shù),pytest 提供了大量的鉤子函數(shù),可以在用例的不同生命周期自動調(diào)用。 比如,在測試用例收集階段,可利用 hook 函數(shù)修改測試用例名稱的編碼。
PYTEST 改寫用例名稱編碼的插件
通常我們會把 hook 函數(shù)編寫在項目的 conftest.py 文件中。
創(chuàng)建測試用例:
運行結(jié)果:
運行時,pytest 會優(yōu)先加載 conftest.py 文件,然后再執(zhí)行測試用例,這個 hook 函數(shù) pytest_collection_modifyitems 是負(fù)責(zé)修改收集上來的測試用例的,也就是我們可以將收集上來的 測試用例重新改寫它的編碼規(guī)范,當(dāng)然也可以修改它的執(zhí)行順序。下面我們來看一下 pytest 提供了哪些 hook 函數(shù)。
PYTEST HOOK 函數(shù)執(zhí)行順序
pytest 提供了大量的 hook 函數(shù),執(zhí)行過程中幾乎所有的行為都是可以定制的。那么,pytest 可以改寫哪 些行為呢? 文字版 pytest hook 執(zhí)行順序:
可以利用 pytest hook 強大的功能開發(fā)出自己的插件。
pytest 編寫插件
大家在運行測試用例的時候,可能會遇到編碼的問題,比如路徑里有中文,展示的時候,可能會出現(xiàn)亂 碼。 測試代碼如下:
上面的代碼實現(xiàn)了 pytest 參數(shù)化的功能,由于測試數(shù)據(jù)有中文,生成的結(jié)果會以 unicode 編碼格式展示 出來,無法展示中文。命令行執(zhí)行結(jié)果如下:
下面我們來開發(fā)一個小插件,插件實現(xiàn)的功能就是將上面的 [\u54c8\u5229] unicode 編碼改成支持中 文的編碼格式。 創(chuàng)建目錄結(jié)構(gòu)如下:
創(chuàng)建插件包 pytest_changecode ,創(chuàng)建測試包 tests
在 tests/test_code.py 文件中添加測試代碼,如下:
在pytest_changecode/__init__.py 文件中添加改寫編碼的內(nèi)容,代碼如下:
從源碼 site_packages/_pytest/hookspec.py 中查看 pytest_collection_modifyitems hook 函 數(shù)的源碼:
是在用例收集完畢之后被調(diào)用,可以過濾或者調(diào)整測試用例執(zhí)行順序。 里面需要傳遞三個參數(shù),其中 items 是測試的用例對象列表??梢酝ㄟ^遍歷 items,然后對每個測試用例的名字重新編碼,實現(xiàn)改寫編 碼的效果。
pytest 插件打包及發(fā)布
場景:一般來說,我們需要用到的功能 pytest 大部分都已經(jīng)提供,即使 pytest 官網(wǎng)沒有提供,第三方插 件的功能也很豐富了。但不同的項目,有特殊的項目需求,比如上面的編碼問題,就沒有解決這個問題 的第三方插件?;蛘唔椖坷镉袀€特殊的功能需求,需要在項目組內(nèi)使用。就可以通過 pytest 打包的方 式,將這個特殊功能安裝布署到其它環(huán)境下。
上面已經(jīng)實現(xiàn)了重新編碼的插件,下面我們將這個插件打包成一個可安裝包,發(fā)布到 https://?http://pypi.org/?上面。 參照官方網(wǎng)址:?https://packaging.python.org/tutorials/packagingprojects/?從官網(wǎng)說明可以看出, setup.py 文件是打包時必不可少的一部分。
SETUP.PY 介紹
setup.py 是 Python 的發(fā)布工具的增強工具(適用于 Python 2.3.5 以上的版本,64 位平臺則適用于 Python 2.4 以上的版本),可以讓程序員更方便的創(chuàng)建和發(fā)布 Python 包,特別是那些對其它包具有依賴 性的狀況。
創(chuàng)建 setup.py 文件到項目 pytest-changecode 根目錄下。
setup.py文件配置:
參數(shù)解析:
name: 打包的名稱, 包名
url: github 地址 version: 打包的版本
classsifiers: 分類索引,添加分類標(biāo)簽,方便別人在 pypi 里搜索到這個插件
license: 授權(quán)證書, 版權(quán)
packages:是應(yīng)該包含在分發(fā)包中的所有 Python 導(dǎo)入包的列表。我們可以使用 find: 指令自動發(fā)現(xiàn) 所有包和子包,而不是手動列出每個包 options.packages.find 文件包指定要使用的包目錄。在本例 中,包列表將是 pytest_changecode ,因為它是唯一存在的包。
keywords: 當(dāng)前包的關(guān)鍵詞, 也是方便?http://pypi.org?進(jìn)行分類搜索
install_requires: 安裝相關(guān)的依賴,當(dāng)安裝這個插件的時候,會自動將相關(guān)的依賴安裝到你的 python 環(huán)境中。這里只依賴了 pytest 庫。
entry_point:配置入口模塊或者入口函數(shù)
注意:如果您想讓您的插件在外部可用,您可以為您的發(fā)行版定義一個所謂的入口點,以便 pytest 找到 您的插件模塊。入口點是由 setuptools 提供的功能。pytest 查找 pytest11 入口點以發(fā)現(xiàn)其插件(冒 號后面是模塊的名稱,冒號前面是為模塊起個別名)。
安裝依賴庫
打包需要依賴兩個第三方庫 setuptools 和 wheel 。
安裝依賴庫:
解釋:
setuptools 是 Python distutils 增強版的集合,它可以幫助我們更簡單的創(chuàng)建和分發(fā) Python 包,尤其是擁有依賴關(guān)系的包。
wheel 是新的 Python disribution ,用于替代 Python 傳統(tǒng)的 .egg 文件。目前有超過一半的庫 文件有對應(yīng)的 wheel 文件。 *.whl 文件有一點與 *.egg 文件相似。實際上它們都是偽裝的 *.zip 文件。如果你將 *.whl 文件名擴展改為 *.zip ,你就可以使用你的 zip 應(yīng)用程序打開它,并且可 以查看它包含的文件夾和文件。
大包
命令行進(jìn)入到 setup.py 文件路徑下,執(zhí)行打包命令:
python setup.py sdist bdist_wheel
執(zhí)行完命令,會在當(dāng)前項目下,生成三個文件夾 build , dist , pytest_change.egg-info 。
其中 dist 里有個 pytest_changecode-1.0-py3-none-any.whl 和 pytest_changecode-1.0.tar.gz ,其中 .whl 文件是安裝包,可以使用 pip 安裝到 python 環(huán)境 中。 .tar.gz 是源碼包。
可以使用 python setup.py install 進(jìn)行源碼安裝。
使用 pip install pytest_changecode-1.0-py3-none-any.whl 完成插件的安裝。
這時使用 pytest 解釋器再次運行 tests/test_code.py 文件,運行結(jié)果:
這時編碼已經(jīng)成功轉(zhuǎn)成中文,說明我們的插件已經(jīng)成功安裝到 python 環(huán)境中。
發(fā)布
現(xiàn)在可以將你打包的插件上傳到?https://pypi.org?上面,供別人下載使用了。
參照官方說明:?https://packaging.python.org/tutorials/packaging-projects/
1、注冊帳號
注冊一個 pypi 的帳號
2、創(chuàng)建 TOKEN
去?https://test.pypi.org/manage/account/#api-tokens?創(chuàng)建一個新的 API token。不要將其范 圍限制到特定的項目,因為您正在創(chuàng)建一個新項目。
注意:
關(guān)閉頁面前一定要復(fù)制這個 token,因為這個 token 只展示一次。
創(chuàng)建文件 $HOME/.pypirc
3、上傳包到 PYPI 上
twine 是開發(fā)人員向 pypi 上傳包的工具,安裝 twine:
python3 -m pip install --user --upgrade twine
運行上傳命令:
python3 -m twine upload --repository testpypi dist/*
系統(tǒng)將提示您輸入用戶名和密碼。 對于用戶名,請使用 __token__ 。 對于密碼,使用令牌值,包括 pypi- 前綴。 命令完成后,您將看到類似以下內(nèi)容的輸出:
上傳后,你的包應(yīng)該可以在?http://pypi.org?上查看,例如,?https://test.pypi.org/project/pytestchangecode?。