如何調用 pytest

一般來說,pytest 是使用命令 pytest 調用的(有關其他調用 pytest 的方法,請參見下文)。這將執行目前目錄及其子目錄中,所有名稱符合 test_*.py\*_test.py 形式的檔案中的所有測試。更廣泛地說,pytest 遵循標準測試發現規則

指定要運行的測試

Pytest 支持多種方法,可以從命令列或檔案中運行和選擇測試(有關從檔案讀取參數,請參見下文)。

在模組中運行測試

pytest test_mod.py

在目錄中運行測試

pytest testing/

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

pytest -k 'MyClass and not method'

這將運行名稱與給定的字串表達式(不區分大小寫)匹配的測試,其中可以包含使用檔名、類名和函數名作為變數的 Python 運算符。上面的範例將運行 TestMyClass.test_something,但不運行 TestMyClass.test_method_simple。在 Windows 上運行時,請在表達式中使用 "" 而不是 ''

通過收集參數運行測試

傳遞相對於工作目錄的模組檔名,後跟以 :: 字元分隔的類名和函數名等指定符,以及封閉在 [] 中的參數化參數。

要在模組中運行特定測試

pytest tests/test_mod.py::test_func

要在類中運行所有測試

pytest tests/test_mod.py::TestClass

指定特定的測試方法

pytest tests/test_mod.py::TestClass::test_method

指定測試的特定參數化

pytest tests/test_mod.py::test_func[x1,y2]

通過標記表達式運行測試

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

pytest -m slow

運行所有使用帶註釋的 @pytest.mark.slow(phase=1) 裝飾器裝飾的測試,其中 phase 關鍵字參數設置為 1

pytest -m "slow(phase=1)"

有關更多資訊,請參見標記

從包中運行測試

pytest --pyargs pkg.testing

這將導入 pkg.testing 並使用其文件系統位置來查找和運行測試。

從檔案讀取參數

在版本 8.2 中新增。

以上所有內容都可以使用 @ 前綴從檔案中讀取

pytest @tests_to_run.txt

其中 tests_to_run.txt 每行包含一個條目,例如

tests/test_file.py
tests/test_mod.py::test_func[x1,y2]
tests/test_mod.py::TestClass
-m slow

這個檔案也可以使用 pytest --collect-only -q 生成,並根據需要進行修改。

獲取有關版本、選項名稱、環境變數的幫助

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

分析測試執行持續時間

在版本 6.0 中更改。

要獲取超過 1.0 秒的最慢 10 個測試持續時間的列表

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

預設情況下,pytest 不會顯示太短的測試持續時間(<0.005 秒),除非在命令列中傳遞 -vv

管理插件的加載

提前加載插件

您可以使用 -p 選項在命令列中顯式提前加載插件(內部和外部)。

pytest -p mypluginmodule

該選項接收一個 name 參數,可以是

  • 完整的模組點狀名稱,例如 myproject.plugins。這個點狀名稱必須是可導入的。

  • 插件的入口點名稱。這是插件註冊時傳遞給 importlib 的名稱。例如,要提前加載 pytest-cov 插件,您可以使用

    pytest -p pytest_cov
    

禁用插件

要在調用時禁用加載特定插件,請將 -p 選項與前綴 no: 一起使用。

範例:要禁用加載插件 doctest,該插件負責從文本檔案執行 doctest 測試,請像這樣調用 pytest

pytest -p no:doctest

調用 pytest 的其他方法

通過 python -m pytest 調用 pytest

您可以通過命令列從 Python 解釋器調用測試。

python -m pytest [...]

這幾乎等同於直接調用命令列腳本 pytest [...],不同之處在於通過 python 調用也會將當前目錄添加到 sys.path

從 Python 代碼調用 pytest

您可以直接從 Python 代碼調用 pytest

retcode = pytest.main()

這就像您從命令列調用 “pytest” 一樣。它不會引發 SystemExit,而是返回退出代碼。如果您不向其傳遞任何參數,main 會從進程的命令列參數 (sys.argv) 中讀取參數,這可能是不希望發生的。您可以顯式傳遞選項和參數

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

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

# content of myinvoke.py
import sys

import pytest


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


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

運行它將顯示已添加 MyPlugin 並且其 hook 已被調用

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

注意

調用 pytest.main() 將導致導入您的測試以及它們導入的任何模組。由於 python 導入系統的緩存機制,從同一進程後續調用 pytest.main() 將不會反映調用之間對這些檔案的更改。因此,不建議從同一進程多次調用 pytest.main()(例如,為了重新運行測試)。