二、第二章
2.1通過python -m pytest調(diào)用pytest ----- 調(diào)用方式后期完善其他調(diào)用
這是在2.0版本中新引入的功能。
你可以通過python的解釋器,利用命令行來調(diào)用測試:
python ‐m pytest [...]
這種調(diào)用方式幾乎等同于直接調(diào)用pytest […],但需要注意的是這種通過python來調(diào)用的方式同時會
將當(dāng)前目錄添加到sys.path
2.2退出碼
pytest有以下6種退出碼:
Exit code 0: 找到所有測試用例并測試通過
Exit code 1: 找到測試用例并運行但是部分測試用例運行失敗
Exit code 2: 用戶中斷了測試
Exit code 3: 執(zhí)行過程中發(fā)生了內(nèi)部錯誤
Exit code 4: pytest命令行使用錯誤
Exit code 5: 沒有找到任何測試用例
2.3 版本信息,參數(shù)名,環(huán)境變量的幫助
pytest ‐‐version #顯示pytest的import的路徑
pytest ‐‐fixtures #顯示內(nèi)置的函數(shù)參數(shù)
pytest ‐h | ‐‐help #幫助信息
2.4 第一(N)次測試失敗后停止
使用下面的參數(shù)可以讓測試在第1(N)次測試失敗后停止:
pytest ‐x # 第一次測試失敗后停止測試
pytest ‐‐maxfail=2 # 第2次測試失敗后停止測試
2.5指定/選擇測試用例
Pytest在命令行中支持多種方式來運行和選擇測試用例:
對模塊中進行測試:
pytest test_mod.py
對文件夾中進行測試:
pytest testing/
通過關(guān)鍵字表達式來進行測試:
pytest ‐k "MyClass and not method"
這種方式會執(zhí)行文件名,類名以及函數(shù)名與給定的字符串表達式相匹配的測試用例。 上面的用例會執(zhí)
行TestMyClass.test_something但是不會執(zhí)行TestMyClass.test_method_simple
and not 在這里是表達式,未經(jīng)過測試
通過節(jié)點id來進行測試
每個被選中的測試用例都會被分配一個唯一的nodeid,它由模塊文件名和以下說明符組成:參數(shù)化的
類名、函數(shù)名和參數(shù),用::分隔。
可以通過下面的方式運行模塊中的指定的測試用例:
pytest test_mod.py::test_func
也可以通過下面這種方式:
pytest test_mod.py::TestClass::test_method
通過標(biāo)記符來進行測試
pytest ‐m slow
這種方式會運行所有通過裝飾器 @pytest.mark.slow進行裝飾的測試用例。
關(guān)于標(biāo)記符請參考marks
通過包來運行
pytest ‐‐pyargs pkg.testing
這種方式會導(dǎo)入pkg.testing,并且基于該包所在為止來查找并運行測試用例。
2.6詳盡的測試報告
參數(shù)**-r**可以用來在測試結(jié)束后展示一份“測試概要信息”,這使得在大型測試套中獲取一份清楚
的測試結(jié)果(失敗,跳過等測試信息)十分簡單。
示例:
#test_example.py的內(nèi)容
import pytest
@pytest.fixture
def error_fixture():
assert 0
def test_ok():
print("ok")
def test_fail():
assert 0
def test_error(error_fixture):
pass
def test_skip():
pytest.skip("skipping this test")
def test_xfail():
pytest.xfail("xfailing this test")
@pytest.mark.xfail(reason="always xfail")
def test_xpass():
pass
C:\>pytest ‐ra
2.7 測試失敗時自動調(diào)用PDB
pytest允許通過命令行使能在測試失敗時自動調(diào)用python的內(nèi)置調(diào)試工具PDB:
pytest ‐‐pdb
這會在每次測試失敗(或者發(fā)生KeyboardInterrupt)的時候都去調(diào)用PDB。通常我們可能只需要在第
一次測試失敗的時候來調(diào)用pdb:
pytest ‐x ‐‐pdb #首次失敗的時候調(diào)用pdb,然后結(jié)束測試進程
pytest ‐‐pdb ‐‐maxfail=3 #前三次失敗的時候調(diào)用pdb
注意所有的異常信息都會保存在sys.last_value, sys.last_type和sys.last_traceback中。 在交互使用
中,這允許使用任何調(diào)試工具進入后期調(diào)試。我們也可以手動的訪問這些異常信息,如下:
(Pdb) import sys
(Pdb) sys.last_traceback.tb_lineno
1448
(Pdb) sys.last_value
AssertionError('assert 0')
(Pdb) sys.last_type
<class 'AssertionError'>
2.8 測試啟動時調(diào)用PDB
pytest允許在測試啟動時立即調(diào)用pdb:
pytest ‐‐trace
這會在每個測試開始時立即調(diào)用python的pdb
2.9 設(shè)置斷點
在代碼中使用python的原生接口**python import pdb; pdb.set_trace()**來設(shè)置斷點,在pytest中
會自動禁用該測試的輸出捕獲:
*其他測試的輸出捕獲不會受影響
*先前的測試中已經(jīng)被捕獲的輸出會被正常處理
*同一測試中的后續(xù)輸出不會被捕獲,而被轉(zhuǎn)發(fā)給sys.stdout。注意即使退出交互式pdb繼續(xù)運行測
試,這一設(shè)置依然生效
2.10分析測試時間
pytest.main()
這和在命令行中使用pytest是一樣的, 這種方式不會拋出SystemExit異常,而會返回exitcode, 通
過如下方式可以傳入調(diào)用參數(shù):
pytest.main(['‐x', 'mytestdir'])
你可以在pytest.main中指定額外的插件:
# myinvoke.py的內(nèi)容
import pytest
class MyPlugin(object):
def pytest_sessionfinish(self):
print("*** test run reporting finishing")
pytest.main(["‐qq"], plugins=[MyPlugin()])
運行代碼就可以發(fā)現(xiàn)MyPlugin被添加到hook里并被調(diào)用:
C:\>python myinvoke.py
**注意:**調(diào)用pytest.main()會導(dǎo)入你的測試用例及其所引用的所有的模塊。因為python存在模塊導(dǎo)
入的緩存機制,如果多次調(diào)用pytest.main(),后續(xù)的調(diào)用也不會再刷新這些導(dǎo)入的資源。因此,不建
議再同一進程中多次調(diào)用pytest.main() (比如重新運行測試).