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

2022-03-18 09:51 更新

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

指定要運行的測試

Pytest 支持多種從命令行運行和選擇測試的方法。

在模塊中運行測試

pytest test_mod.py

在目錄中運行測試

pytest testing/

通過關鍵字表達式運行測試

pytest -k "MyClass and not method"

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

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

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

要在模塊中運行特定測試:

pytest test_mod.py::test_func

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

pytest test_mod.py::TestClass::test_method

通過標記表達式運行測試

pytest -m slow

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

從包運行測試

pytest --pyargs pkg.testing

這將導入 ?pkg.testing? 并使用其文件系統(tǒ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

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

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

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

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

管理插件的加載

提前加載插件

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

pytest -p mypluginmodule

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

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

pytest -p pytest_cov

禁用插件

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

示例:要禁用加載插件 ?doctest?,該插件負責從文本文件執(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)用還會將當前目錄添加到 ?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()]))

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

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

注解

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


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號