pytest 核心功能-調(diào)用pytest

2022-03-18 09:51 更新

通常,pytest 使用命令 ?pytest ?調(diào)用。這將執(zhí)行當(dāng)前目錄及其子目錄中名稱遵循 ?test_*.py? 或 ?\*_test.py? 形式的所有文件中的所有測(cè)試。 更一般地說(shuō),pytest 遵循標(biāo)準(zhǔn)的測(cè)試發(fā)現(xiàn)規(guī)則。

指定要運(yùn)行的測(cè)試

Pytest 支持多種從命令行運(yùn)行和選擇測(cè)試的方法。

在模塊中運(yùn)行測(cè)試

pytest test_mod.py

在目錄中運(yùn)行測(cè)試

pytest testing/

通過(guò)關(guān)鍵字表達(dá)式運(yùn)行測(cè)試

pytest -k "MyClass and not method"

這將運(yùn)行包含與給定字符串表達(dá)式匹配的名稱(不區(qū)分大小寫)的測(cè)試,其中可以包括使用文件名、類名和函數(shù)名作為變量的 Python 運(yùn)算符。 上面的示例將運(yùn)行 ?TestMyClass.test_something? 但不是 ?TestMyClass.test_method_simple?

按節(jié)點(diǎn)ID運(yùn)行測(cè)試

每個(gè)收集到的測(cè)試都分配有一個(gè)唯一的 ?nodeid?,它由模塊文件名和后面的說(shuō)明符組成,如類名、函數(shù)名和來(lái)自參數(shù)化的參數(shù),用?::?字符分隔。

要在模塊中運(yùn)行特定測(cè)試:

pytest test_mod.py::test_func

在命令行中指定測(cè)試方法的另一個(gè)示例:

pytest test_mod.py::TestClass::test_method

通過(guò)標(biāo)記表達(dá)式運(yùn)行測(cè)試

pytest -m slow

將運(yùn)行所有使用 ?@pytest.mark.slow? 裝飾器裝飾的測(cè)試。

從包運(yùn)行測(cè)試

pytest --pyargs pkg.testing

這將導(dǎo)入 ?pkg.testing? 并使用其文件系統(tǒng)位置來(lái)查找和運(yùn)行測(cè)試。

獲取有關(guān)版本、選項(xiàng)名稱、環(huán)境變量的幫助

pytest --version   # shows where pytest was imported from
pytest --fixtures  # show available builtin function arguments
pytest -h | --help # show help on command line and config file options

分析測(cè)試執(zhí)行時(shí)間

要獲得超過(guò)1.0秒的最慢10個(gè)測(cè)試持續(xù)時(shí)間的列表:

pytest --durations=10 --durations-min=1.0

默認(rèn)情況下,除非在命令行上傳遞了? -vv?,否則 pytest 不會(huì)顯示太?。?lt;0.005s)的測(cè)試持續(xù)時(shí)間。

管理插件的加載

提前加載插件

您可以使用 ?-p? 選項(xiàng)在命令行中顯式地提前加載插件(內(nèi)部和外部):

pytest -p mypluginmodule

該選項(xiàng)接收一個(gè)?name?參數(shù),可以是:

  • 完整的模塊名稱,例如 ?myproject.plugins?。 這個(gè)帶點(diǎn)的名稱必須是可導(dǎo)入的。
  • 插件的入口點(diǎn)名稱。 這是注冊(cè)插件時(shí)傳遞給 ?setuptools ?的名稱。 例如,要提前加載 ?pytest-cov? 插件,您可以使用:

pytest -p pytest_cov

禁用插件

要在調(diào)用時(shí)禁用加載特定插件,請(qǐng)使用 ?-p? 選項(xiàng)和前綴 ?no:?

示例:要禁用加載插件 ?doctest?,該插件負(fù)責(zé)從文本文件執(zhí)行 ?doctest ?測(cè)試,請(qǐng)像這樣調(diào)用 ?pytest?:

pytest -p no:doctest

調(diào)用pytest的其他方式

通過(guò) python -m pytest 調(diào)用 pytest

您可以從命令行通過(guò) Python 解釋器調(diào)用測(cè)試:

python -m pytest [...]

這幾乎等同于直接調(diào)用命令行腳本 ?pytest [...]?,只是通過(guò) python 調(diào)用還會(huì)將當(dāng)前目錄添加到 ?sys.path? 中。

從 Python 代碼調(diào)用 pytest

您可以直接從 Python 代碼調(diào)用 ?pytest?:

retcode = pytest.main()

這就像您從命令行調(diào)用?pytest?一樣。 它不會(huì)引發(fā) ?SystemExit ?而是返回退出代碼。 您可以傳入選項(xiàng)和參數(shù):

retcode = pytest.main(["-x", "mytestdir"])

您可以為? pytest.main? 指定其他插件:

# content of myinvoke.py
import pytest
import sys


class MyPlugin:
    def pytest_sessionfinish(self):
        print("*** test run reporting finishing")


if __name__ == "__main__":
    sys.exit(pytest.main(["-qq"], plugins=[MyPlugin()]))

運(yùn)行它將顯示 ?MyPlugin ?已添加并且它的鉤子已被調(diào)用:

$ python myinvoke.py
*** test run reporting finishing

注解

調(diào)用 ?pytest.main()? 將導(dǎo)致導(dǎo)入您的測(cè)試以及它們導(dǎo)入的任何模塊。 由于 python 導(dǎo)入系統(tǒng)的緩存機(jī)制,從同一進(jìn)程對(duì) ?pytest.main()? 的后續(xù)調(diào)用將不會(huì)反映調(diào)用之間對(duì)這些文件的更改。 因此,不建議從同一進(jìn)程多次調(diào)用 ?pytest.main()?(例如,為了重新運(yùn)行測(cè)試)。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)