【pytest官方檔案】解讀- 開發可pip安裝的第三方外掛

2022-10-26 21:00:19

在上一篇的 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

一步步跟著出現的指令提示,輸入對應的專案資訊即可。

最後的輸入的一個測試外掛專案是這樣的。

二、開發第三方外掛

重新寫一個外掛,可以通過命令列,來輸出蒐集到的測試用例的相關資訊並儲存到csv檔案中去。

可以直接在上面生成好的外掛專案模板裡寫我們自己的程式碼。

  • 紅色檔案,就是我們外掛程式碼的主體部分
  • 綠色部分,是我們自測外掛程式碼的地方

最後還有個重要檔案setup.py,因為外掛模板專案自動生成了,裡面就是外掛專案的相關資訊,以及依賴。

1. 外掛主體程式碼

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 檔案中。

2. 測試外掛程式碼

外掛主體程式碼寫好了,我們需要自測一下。

按之前的話,可以直接把外掛程式碼寫到本地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 檔案驗證一下結果,輸出正確。

3. 打包

回到專案根目錄,命令列輸入:

python setup.py sdist build

完成後會生成dist目錄,下面就有對應的包。

4. 上傳 pypi

沒有賬號的要先註冊登入一下,記得要去對應填寫的郵箱裡點選啟用認證才可以。

接著安裝twine,我能使用這個工具來上傳。

pip install twine

安裝完成後就可以執行了上傳:

twine upload dist/*

提示需要輸入註冊的賬號和密碼,最後完成上傳。

上傳完成後就可以在pypi中開啟自己的外掛主頁了,現在其他小夥伴也可以安裝外掛了。