目錄
2.1 如何調用pytest
2.1.1 指定要運行的測試
2.1.2 獲取有關版本、選項名稱、環境變量的幫助
2.1.3 分析測試執行時間
2.1.4 管理加載插件
2.1.5 調用pytest的其他方式
2.1 如何調用pytest
2.1.1 指定要運行的測試
Pytest支持幾種從命令行運行和選擇測試的方法。、
在模塊中運行測試
pytest test_mod.py
在目錄中運行測試
pytest testing/
按關鍵字表達式運行測試
pytest -k 'MyClass and not method'
這將運行包含與給定名稱匹配的名稱的測試字符串表達式 (不區分大小寫),它可以包括使用文件名、類名和函數名作為變量的Python運算符。上面的例子將運行 TestMyClass.test_something 但不是 TestMyClass.test_method_simple。在Windows系統上運行時使用雙引號("")而不是單引號('')來表示表達式。
按節點ID運行測試
每個收集到的測試都被分配一個唯一的節點ID(nodeid),該節點ID由模塊文件名和后綴組成,后綴包括類名、函數名和由參數化生成的參數,這些部分以雙冒號(::)分隔。
要在模塊中運行特定測試,請執行以下操作:
pytest test_mod.py::test_func
在命令行中指定測試方法的另一個示例:
pytest test_mod.py::TestClass::test_method
通過標記表達式運行測試
pytest -m slow
將運行所有用@pytest.mark.slow裝飾器裝飾的測試。
有關詳細信息,請參見 marks。
從包運行測試
pytest --pyargs pkg.testing
這將導入 pkg.testing 并使用其文件系統位置來查找和運行測試。
2.1.2 獲取有關版本、選項名稱、環境變量的幫助
pytest --version # shows where pytest was imported from(顯示pytest的導入位置)
pytest --fixtures # show available builtin function arguments (顯示可用的內置函數參數)
pytest -h | --help # show help on command line and config file options(顯示有關命令行和配置文件選項的幫助)
2.1.3 分析測試執行時間
在6.0版中進行了更改。
要獲得超過1.0秒的最慢10個測試持續時間的列表:
pytest --durations=10 --durations-min=1.0
默認情況下,pytest不會顯示太小(<0.005s)的測試持續時間,除非在命令行上傳遞-vv。
2.1.4 管理加載插件
早期加載插件(Early loading plugins)
您可以使用-p選項在命令行中顯示早期加載插件(內部和外部):
pytest -p mypluginmodule
該選項接收一個name參數,該參數可以是:
- 完整的模塊虛線名稱,例如myproject.plugins。此虛線名稱必須是可導入的。
- 插件的入口點名稱。這是注冊插件時傳遞給setuptools的名稱。例如,要提前加載pytest-cov插件,您可以使用:
pytest -p pytest_cov
禁用插件(Disabling plugins)
要禁用在調用時加載特定插件,請將-p選項與前綴no:一起使用。
示例:要禁用加載插件doctest,該插件負責從文本文件執行doctest測試,請如下調用pytest:
pytest -p no:doctest
2.1.5 調用pytest的其他方式
通過python -m pytest調用pytest
您可以從命令行通過Python解釋器調用測試:
python -m pytest [...]
這幾乎相當于直接調用命令行腳本pytest[…],只是通過python調用也會將當前目錄添加到sys.path中。
從Python代碼調用pytest
您可以直接從Python代碼中調用pytest:
retcode = pytest.main()
這就好像您要從命令行調用“pytest”一樣。它不會引發SystemExit,而是返回退出代碼。您可以傳入選項和參數:
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并調用:
$ python myinvoke.py
*** test run reporting finishing
注:
調用pytest.main()將導入測試及其導入的任何模塊。由于python導入系統的緩存機制,從同一進程對pytest.main()進行后續調用不會反映調用之間對這些文件的更改。因此,不建議從同一進程多次調用pytest.main()(例如,為了重新運行測試)。