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

2022-03-18 09:51 更新

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

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

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

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

pytest test_mod.py

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

pytest testing/

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

pytest -k "MyClass and not method"

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

按節(jié)點ID運(yùn)行測試

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

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

pytest test_mod.py::test_func

在命令行中指定測試方法的另一個示例:

pytest test_mod.py::TestClass::test_method

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

pytest -m slow

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

從包運(yùn)行測試

pytest --pyargs pkg.testing

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

獲取有關(guān)版本、選項名稱、環(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

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

要獲得超過1.0秒的最慢10個測試持續(xù)時間的列表:

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

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

管理插件的加載

提前加載插件

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

pytest -p mypluginmodule

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

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

pytest -p pytest_cov

禁用插件

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

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

pytest -p no:doctest

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

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

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

python -m pytest [...]

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

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

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

retcode = pytest.main()

這就像您從命令行調(diào)用?pytest?一樣。 它不會引發(fā) ?SystemExit ?而是返回退出代碼。 您可以傳入選項和參數(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)入您的測試以及它們導(dǎo)入的任何模塊。 由于 python 導(dǎo)入系統(tǒng)的緩存機(jī)制,從同一進(jìn)程對 ?pytest.main()? 的后續(xù)調(diào)用將不會反映調(diào)用之間對這些文件的更改。 因此,不建議從同一進(jìn)程多次調(diào)用 ?pytest.main()?(例如,為了重新運(yùn)行測試)。


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號