如何調用 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()
(例如,為了重新運行測試)。