Pytest官方教程-09-捕獲stdout及stderr輸出

目錄:

  1. 安裝及入門
  2. 使用和調(diào)用方法
  3. 原有TestSuite使用方法
  4. 斷言的編寫和報(bào)告
  5. Pytest fixtures:清晰 模塊化 易擴(kuò)展
  6. 使用Marks標(biāo)記測(cè)試用例
  7. Monkeypatching/對(duì)模塊和環(huán)境進(jìn)行Mock
  8. 使用tmp目錄和文件
  9. 捕獲stdout及stderr輸出
  10. 捕獲警告信息
  11. 模塊及測(cè)試文件中集成doctest測(cè)試
  12. skip及xfail: 處理不能成功的測(cè)試用例
  13. Fixture方法及測(cè)試用例的參數(shù)化
  14. 緩存: 使用跨執(zhí)行狀態(tài)
  15. unittest.TestCase支持
  16. 運(yùn)行Nose用例
  17. 經(jīng)典xUnit風(fēng)格的setup/teardown
  18. 安裝和使用插件
  19. 插件編寫
  20. 編寫鉤子(hook)方法
  21. 運(yùn)行日志
  22. API參考
    1. 方法(Functions)
    2. 標(biāo)記(Marks)
    3. 鉤子(Hooks)
    4. 裝置(Fixtures)
    5. 對(duì)象(Objects)
    6. 特殊變量(Special Variables)
    7. 環(huán)境變量(Environment Variables)
    8. 配置選項(xiàng)(Configuration Options)
  23. 優(yōu)質(zhì)集成實(shí)踐
  24. 片狀測(cè)試
  25. Pytest導(dǎo)入機(jī)制及sys.path/PYTHONPATH
  26. 配置選項(xiàng)
  27. 示例及自定義技巧
  28. 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.stdoutsys.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鬼佣,capfdcapfdbinary 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è)屬性outerrnamedtuple哥牍。

3.3版本新功能
如果測(cè)試中的代碼寫入了非文本數(shù)據(jù)毕泌,則可以使用capsysbinary fixture來捕獲它,而后者會(huì)從readouterr方法返回字節(jié)砂心。 capfsysbinary fixture目前僅在Python 3中可用懈词。

3.0版本新功能
要暫時(shí)禁用測(cè)試中的捕獲,capsyscapfd都有一個(gè)disabled()方法辩诞,可以用作上下文管理器,禁用with塊內(nèi)的捕獲:

def test_disabling_capturing(capsys):
    print("輸出被捕獲到了")
    with capsys.disabled():
        print("輸出未捕獲到纺涤,直接使用sys.stdout標(biāo)準(zhǔn)輸出")
    print("這個(gè)輸出也被捕獲到了")
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末译暂,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子撩炊,更是在濱河造成了極大的恐慌外永,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拧咳,死亡現(xiàn)場(chǎng)離奇詭異伯顶,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)骆膝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門祭衩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人阅签,你說我怎么就攤上這事掐暮。” “怎么了政钟?”我有些...
    開封第一講書人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵路克,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我养交,道長(zhǎng)精算,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任碎连,我火速辦了婚禮灰羽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘破花。我一直安慰自己谦趣,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開白布座每。 她就那樣靜靜地躺著前鹅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪峭梳。 梳的紋絲不亂的頭發(fā)上舰绘,一...
    開封第一講書人閱讀 51,775評(píng)論 1 307
  • 那天蹂喻,我揣著相機(jī)與錄音,去河邊找鬼捂寿。 笑死口四,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的秦陋。 我是一名探鬼主播蔓彩,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼驳概!你這毒婦竟也來了赤嚼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤顺又,失蹤者是張志新(化名)和其女友劉穎更卒,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體稚照,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蹂空,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了果录。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片上枕。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖雕憔,靈堂內(nèi)的尸體忽然破棺而出姿骏,到底是詐尸還是另有隱情,我是刑警寧澤斤彼,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布分瘦,位于F島的核電站,受9級(jí)特大地震影響琉苇,放射性物質(zhì)發(fā)生泄漏嘲玫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一并扇、第九天 我趴在偏房一處隱蔽的房頂上張望去团。 院中可真熱鬧,春花似錦穷蛹、人聲如沸土陪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鬼雀。三九已至,卻和暖如春蛙吏,著一層夾襖步出監(jiān)牢的瞬間源哩,已是汗流浹背鞋吉。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留励烦,地道東北人谓着。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像坛掠,于是被迫代替她去往敵國(guó)和親赊锚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

推薦閱讀更多精彩內(nèi)容