目錄:
- 安裝及入門
- 使用和調(diào)用方法
- 原有TestSuite使用方法
- 斷言的編寫和報(bào)告
- Pytest fixtures:清晰 模塊化 易擴(kuò)展
- 使用Marks標(biāo)記測(cè)試用例
- Monkeypatching/對(duì)模塊和環(huán)境進(jìn)行Mock
- 使用tmp目錄和文件
- 捕獲stdout及stderr輸出
- 捕獲警告信息
- 模塊及測(cè)試文件中集成doctest測(cè)試
- skip及xfail: 處理不能成功的測(cè)試用例
- Fixture方法及測(cè)試用例的參數(shù)化
- 緩存: 使用跨執(zhí)行狀態(tài)
- unittest.TestCase支持
- 運(yùn)行Nose用例
- 經(jīng)典xUnit風(fēng)格的setup/teardown
- 安裝和使用插件
- 插件編寫
- 編寫鉤子(hook)方法
- 運(yùn)行日志
- API參考
- 優(yōu)質(zhì)集成實(shí)踐
- 片狀測(cè)試
- Pytest導(dǎo)入機(jī)制及sys.path/PYTHONPATH
- 配置選項(xiàng)
- 示例及自定義技巧
- Bash自動(dòng)補(bǔ)全設(shè)置
捕獲stdout及stderr輸出
默認(rèn) stdout/stderr/stdin 捕獲行為
在測(cè)試執(zhí)行期間盼砍,程序中的標(biāo)準(zhǔn)輸出/標(biāo)準(zhǔn)錯(cuò)誤輸出都會(huì)被捕獲到油挥。 如果測(cè)試或setup方法執(zhí)行失敗時(shí)拿霉,會(huì)在報(bào)錯(cuò)追溯信息中查看到程序中的標(biāo)準(zhǔn)輸出及標(biāo)準(zhǔn)錯(cuò)誤輸出。(可以通過--show-capture
命令行選項(xiàng)配置是否捕獲程序中的標(biāo)準(zhǔn)輸出/標(biāo)準(zhǔn)錯(cuò)誤輸出)站叼。
此外引谜,stdin
被設(shè)置為“null”對(duì)象锦积,測(cè)試運(yùn)行過程中無法從中讀取數(shù)據(jù)响牛,因?yàn)樵谶\(yùn)行自動(dòng)化測(cè)試時(shí)很少需要等待交互式輸入。
捕獲默認(rèn)是通過攔截對(duì)低優(yōu)先級(jí)文件描述符的寫入來完成的查蓉。 這允許捕獲簡(jiǎn)單print語句的輸出以及測(cè)試啟動(dòng)的子進(jìn)程的輸出乌询。
設(shè)置捕獲方法或禁用捕獲
pytest
可以通過兩種方式捕獲輸出:
- 文件描述符(FD)級(jí)別捕獲(默認(rèn)):將捕獲進(jìn)入操作系統(tǒng)文件描述符1和2的所有寫入。
-
sys
級(jí)別捕獲:僅捕獲Python文件sys.stdout
和sys.stderr
豌研。 不執(zhí)行對(duì)文件描述符的寫入捕獲妹田。
你可以在命令行中指定不同的參數(shù)來使用不同的捕獲機(jī)制:
pytest -s # 禁止捕獲所有輸出
pytest --capture=sys # 使用in-mem文件代替sys.stdout/stderr with
pytest --capture=fd # 同時(shí)將filedescriptors 1和2指向臨時(shí)文件
調(diào)試中使用print語句
默認(rèn)捕獲stdout / stderr輸出的一個(gè)主要好處是可以使用print語句進(jìn)行調(diào)試:
# test_module.py文件內(nèi)容
def setup_function(function):
print("setting up %s" % function)
def test_func1():
assert True
def test_func2():
assert False
運(yùn)行此模塊將只捕獲失敗用例相關(guān)的print信息,而不顯示成功用例的print信息:
$ pytest
=========================== test session starts ============================
platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y
rootdir: $REGENDOC_TMPDIR, inifile:
collected 2 items
test_module.py .F [100%]
================================= FAILURES =================================
________________________________ test_func2 ________________________________
def test_func2():
> assert False
E assert False
test_module.py:9: AssertionError
-------------------------- Captured stdout setup ---------------------------
setting up <function test_func2 at 0xdeadbeef>
==================== 1 failed, 1 passed in 0.12 seconds ====================
在測(cè)試方法中使用的捕獲的輸出
capsys
鹃共,capsysbinary
鬼佣,capfd
和capfdbinary fixture
允許訪問在測(cè)試執(zhí)行期間創(chuàng)建的stdout
/ stderr
輸出。 下面是一個(gè)測(cè)試函數(shù)示例霜浴,它執(zhí)行一些與輸出相關(guān)的檢查:
def test_myoutput(capsys): # or use "capfd" for fd-level
print("hello")
sys.stderr.write("world\n")
captured = capsys.readouterr()
assert captured.out == "hello\n"
assert captured.err == "world\n"
print("next")
captured = capsys.readouterr()
assert captured.out == "next\n"
readouterr()
調(diào)用時(shí)首先對(duì)輸出流建立快照 - 并繼續(xù)捕獲輸出晶衷,然后在該測(cè)試用例執(zhí)行完成后,恢復(fù)原始輸出流阴孟。而通過使用capsys
可以避免在執(zhí)行每個(gè)測(cè)試用例時(shí)都進(jìn)行一次設(shè)置/重置輸出流晌纫,并且還可以與pytest每次測(cè)試用例執(zhí)行時(shí)捕獲的輸出信息進(jìn)行交互。
如果要在filedescriptor
級(jí)別捕獲永丝,可以使用capfd fixture
锹漱,它提供完全相同的接口,但也允許捕獲直接寫入操作系統(tǒng)級(jí)輸出流(FD1和FD2)的庫或子進(jìn)程的輸出流中慕嚷。
3.3版本新功能
readouterr
的返回值更改為具有兩個(gè)屬性out
和err
的namedtuple
哥牍。
3.3版本新功能
如果測(cè)試中的代碼寫入了非文本數(shù)據(jù)毕泌,則可以使用capsysbinary fixture
來捕獲它,而后者會(huì)從readouterr
方法返回字節(jié)砂心。 capfsysbinary fixture
目前僅在Python 3中可用懈词。
3.0版本新功能
要暫時(shí)禁用測(cè)試中的捕獲,capsys
和capfd
都有一個(gè)disabled()
方法辩诞,可以用作上下文管理器,禁用with塊內(nèi)的捕獲:
def test_disabling_capturing(capsys):
print("輸出被捕獲到了")
with capsys.disabled():
print("輸出未捕獲到纺涤,直接使用sys.stdout標(biāo)準(zhǔn)輸出")
print("這個(gè)輸出也被捕獲到了")