Pytest如何輸出Log信息

自動(dòng)化測(cè)試用例的調(diào)試信息非常有用促王,可以讓我們知道現(xiàn)在的運(yùn)行情況到犀盟,執(zhí)行到哪步以及相應(yīng)的出錯(cuò)信息等,可以在pytest里面蝇狼,有時(shí)并不會(huì)輸出所有信息阅畴,比如默認(rèn)情況下pass的測(cè)試用例是沒有print輸出的。本文將介紹如何在pytest里面實(shí)時(shí)顯示所有的log信息迅耘。

1. 用print輸出log信息

slowTest_print.py

import time
 
def test_1():
    print 'test_1'
    time.sleep(1)
    print 'after 1 sec'
    time.sleep(1)
    print 'after 2 sec'
    time.sleep(1)
    print 'after 3 sec'
    assert 1, 'should pass'
 
def test_2():
    print 'in test_2'
    time.sleep(1)
    print 'after 1 sec'
    time.sleep(1)
    print 'after 2 sec'
    time.sleep(1)
    print 'after 3 sec'
    assert 0, 'failing for demo purposes'

運(yùn)行上述程序贱枣,pytest會(huì)capture所有的輸出,保存直到所有的測(cè)試用例都執(zhí)行結(jié)束颤专,并且只輸出那些失敗的測(cè)試用例的信息纽哥,對(duì)于成功的測(cè)試用例,沒有print的信息顯示栖秕。
從下面的運(yùn)行結(jié)果春塌,如果需要查看test_1()的運(yùn)行情況,沒有l(wèi)og信息可看,print沒有顯示摔笤。

C:\Users\yatyang\PycharmProjects\pytest_example>pytest -v slowTest_print.py
============================= test session starts =============================
platform win32 -- Python 2.7.13, pytest-3.0.6, py-1.4.32, pluggy-0.4.0 -- C:\Python27\python.exe
cachedir: .cache
metadata: {'Python': '2.7.13', 'Platform': 'Windows-7-6.1.7601-SP1', 'Packages': {'py': '1.4.32', 'pytest': '3.0.6', 'pluggy': '0.4.0'}, 'JAVA_HOME': 'C:\\Program Files (x86)\\Java\\jd
k1.7.0_01', 'Plugins': {'html': '1.14.2', 'metadata': '1.3.0'}}
rootdir: C:\Users\yatyang\PycharmProjects\pytest_example, inifile:
plugins: metadata-1.3.0, html-1.14.2
collected 2 items 

slowTest_print.py::test_1 PASSED
slowTest_print.py::test_2 FAILED

================================== FAILURES ===================================
___________________________________ test_2 ____________________________________

    def test_2():
        print 'in test_2'
        time.sleep(1)
        print 'after 1 sec'
        time.sleep(1)
        print 'after 2 sec'
        time.sleep(1)
        print 'after 3 sec'
>       assert 0, 'failing for demo purposes'
E       AssertionError: failing for demo purposes
E       assert 0

slowTest_print.py:22: AssertionError
---------------------------- Captured stdout call -----------------------------
in test_2
after 1 sec
after 2 sec
after 3 sec
===================== 1 failed, 1 passed in 6.45 seconds ======================

C:\Users\yatyang\PycharmProjects\pytest_example>

我們可以用‘-s’參數(shù)或者 ‘–capture=no’够滑,這樣就可以輸出所有測(cè)試用的print信息。但是pytest還是會(huì)等著所有的測(cè)試用例都執(zhí)行完畢才會(huì)顯示運(yùn)行結(jié)果吕世≌么ィ可以看到下面的test_1也顯示出print的相關(guān)信息。

C:\Users\yatyang\PycharmProjects\pytest_example>py.test --capture=no slowTest_print.py
============================= test session starts =============================
platform win32 -- Python 2.7.13, pytest-3.0.6, py-1.4.32, pluggy-0.4.0
metadata: {'Python': '2.7.13', 'Platform': 'Windows-7-6.1.7601-SP1', 'Packages': {'py': '1.4.32', 'pytest': '3.0.6', 'pluggy': '0.4.0'}, 'JAVA_HOME': 'C:\\Program Files (x86)\\Java\\jd
k1.7.0_01', 'Plugins': {'html': '1.14.2', 'metadata': '1.3.0'}}
rootdir: C:\Users\yatyang\PycharmProjects\pytest_example, inifile:
plugins: metadata-1.3.0, html-1.14.2
collected 2 items 

slowTest_print.py test_1
after 1 sec
after 2 sec
after 3 sec
.in test_2
after 1 sec
after 2 sec
after 3 sec
F

================================== FAILURES ===================================
___________________________________ test_2 ____________________________________

    def test_2():
        print 'in test_2'
        time.sleep(1)
        print 'after 1 sec'
        time.sleep(1)
        print 'after 2 sec'
        time.sleep(1)
        print 'after 3 sec'
>       assert 0, 'failing for demo purposes'
E       AssertionError: failing for demo purposes
E       assert 0

slowTest_print.py:22: AssertionError
===================== 1 failed, 1 passed in 6.17 seconds ======================

2. Python Logging用法

一般情況下命辖,一些程序的調(diào)試過程中我們會(huì)讓它輸出一些信息况毅,特別是一些大型的程序,我們通過這些信息可以了解程序的運(yùn)行情況尔艇,python提供了一個(gè)日志模塊logging尔许,它可以把我們想要的信息全部保存到一個(gè)日志文件中,方便查看终娃。

import logging

logging.debug('This is debug message')
logging.info('This is info message')
logging.warning('This is warning message')

屏幕上打印:
WARNING:root:This is warning message
默認(rèn)情況下味廊,logging將日志打印到屏幕,日志級(jí)別為WARNING棠耕;
日志級(jí)別大小關(guān)系為:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET余佛,當(dāng)然也可以自己定義日志級(jí)別。

3. 在pytest中用logging代替print

我們現(xiàn)在來看看在pytest的測(cè)試用例里面用logging的輸出代替print窍荧,有什么不同辉巡。
slowTest_logging.py

import time
import logging

logging.basicConfig(level=logging.DEBUG)

def test_1():
    log = logging.getLogger('test_1')
    time.sleep(1)
    log.debug('after 1 sec')
    time.sleep(1)
    log.debug('after 2 sec')
    time.sleep(1)
    log.debug('after 3 sec')
    assert 1, 'should pass'


def test_2():
    log = logging.getLogger('test_2')
    time.sleep(1)
    log.debug('after 1 sec')
    time.sleep(1)
    log.debug('after 2 sec')
    time.sleep(1)
    log.debug('after 3 sec')
    assert 0, 'failing for demo purposes'

運(yùn)行結(jié)果如下,log信息的顯示是不是可讀性更好了呢∪锿耍可是pytest還是要等所有的結(jié)果都運(yùn)行完畢才完全輸出到屏幕上郊楣,沒法看到實(shí)時(shí)的運(yùn)行情況。比如現(xiàn)在要測(cè)試一個(gè)新的image瓤荔,不知道quality如何净蚤,如果測(cè)試用例非常多,測(cè)試人員就得一直等茉贡,也許前面的一些測(cè)試用都失敗就可以停止執(zhí)行了塞栅。那怎么實(shí)現(xiàn)實(shí)時(shí)顯示呢?請(qǐng)看方法4腔丧。

C:\Users\yatyang\PycharmProjects\pytest_example>pytest slowTest_logging.py
============================= test session starts =============================
platform win32 -- Python 2.7.13, pytest-3.0.6, py-1.4.32, pluggy-0.4.0
metadata: {'Python': '2.7.13', 'Platform': 'Windows-7-6.1.7601-SP1', 'Packages': {'py': '1.4.32', 'pytest': '3.0.6', 'pluggy': '0.4.0'}, 'JAVA_HOME': 'C:\\Program Files (x86)\\Java\\jd
k1.7.0_01', 'Plugins': {'html': '1.14.2', 'metadata': '1.3.0'}}
rootdir: C:\Users\yatyang\PycharmProjects\pytest_example, inifile:
plugins: metadata-1.3.0, html-1.14.2
collected 2 items 

slowTest_logging.py .F

================================== FAILURES ===================================
___________________________________ test_2 ____________________________________

    def test_2():
        log = logging.getLogger('test_2')
        time.sleep(1)
        log.debug('after 1 sec')
        time.sleep(1)
        log.debug('after 2 sec')
        time.sleep(1)
        log.debug('after 3 sec')
>       assert 0, 'failing for demo purposes'
E       AssertionError: failing for demo purposes
E       assert 0

slowTest_logging.py:25: AssertionError
---------------------------- Captured stderr call -----------------------------
DEBUG:test_2:after 1 sec
DEBUG:test_2:after 2 sec
DEBUG:test_2:after 3 sec
===================== 1 failed, 1 passed in 6.37 seconds ======================
C:\Users\yatyang\PycharmProjects\pytest_example>pytest -s slowTest_logging.py
============================= test session starts =============================
platform win32 -- Python 2.7.13, pytest-3.0.6, py-1.4.32, pluggy-0.4.0
metadata: {'Python': '2.7.13', 'Platform': 'Windows-7-6.1.7601-SP1', 'Packages': {'py': '1.4.32', 'pytest': '3.0.6', 'pluggy': '0.4.0'}, 'JAVA_HOME': 'C:\\Program Files (x86)\\Java\\jd
k1.7.0_01', 'Plugins': {'html': '1.14.2', 'metadata': '1.3.0'}}
rootdir: C:\Users\yatyang\PycharmProjects\pytest_example, inifile:
plugins: metadata-1.3.0, html-1.14.2
collected 2 items 

slowTest_logging.py DEBUG:test_1:after 1 sec
DEBUG:test_1:after 2 sec
DEBUG:test_1:after 3 sec
.DEBUG:test_2:after 1 sec
DEBUG:test_2:after 2 sec
DEBUG:test_2:after 3 sec
F

================================== FAILURES ===================================
___________________________________ test_2 ____________________________________

    def test_2():
        log = logging.getLogger('test_2')
        time.sleep(1)
        log.debug('after 1 sec')
        time.sleep(1)
        log.debug('after 2 sec')
        time.sleep(1)
        log.debug('after 3 sec')
>       assert 0, 'failing for demo purposes'
E       AssertionError: failing for demo purposes
E       assert 0

slowTest_logging.py:25: AssertionError
===================== 1 failed, 1 passed in 6.18 seconds ======================

4. pytest用logging和--capture=no實(shí)現(xiàn)實(shí)時(shí)輸出log信息

請(qǐng)自己去運(yùn)行下面的程序吧,可以看到該程序是實(shí)時(shí)輸出當(dāng)前測(cè)試用例執(zhí)行的情況作烟。

C:\Users\yatyang\PycharmProjects\pytest_example>pytest -s slowTest_logging.py
============================= test session starts =============================
platform win32 -- Python 2.7.13, pytest-3.0.6, py-1.4.32, pluggy-0.4.0
metadata: {'Python': '2.7.13', 'Platform': 'Windows-7-6.1.7601-SP1', 'Packages': {'py': '1.4.32', 'pytest': '3.0.6', 'pluggy': '0.4.0'}, 'JAVA_HOME': 'C:\\Program Files (x86)\\Java\\jd
k1.7.0_01', 'Plugins': {'html': '1.14.2', 'metadata': '1.3.0'}}
rootdir: C:\Users\yatyang\PycharmProjects\pytest_example, inifile:
plugins: metadata-1.3.0, html-1.14.2
collected 2 items 

slowTest_logging.py DEBUG:test_1:after 1 sec
DEBUG:test_1:after 2 sec
DEBUG:test_1:after 3 sec
.DEBUG:test_2:after 1 sec
DEBUG:test_2:after 2 sec
DEBUG:test_2:after 3 sec
F

================================== FAILURES ===================================
___________________________________ test_2 ____________________________________

    def test_2():
        log = logging.getLogger('test_2')
        time.sleep(1)
        log.debug('after 1 sec')
        time.sleep(1)
        log.debug('after 2 sec')
        time.sleep(1)
        log.debug('after 3 sec')
>       assert 0, 'failing for demo purposes'
E       AssertionError: failing for demo purposes
E       assert 0

slowTest_logging.py:25: AssertionError
===================== 1 failed, 1 passed in 6.20 seconds ======================

5.總結(jié)

在寫自動(dòng)化測(cè)試用例時(shí)愉粤,添加有用的log信息是非常有必要的。比如在初期的調(diào)試過程拿撩,能夠一旦運(yùn)行有問題衣厘,就可以獲取到精確的調(diào)試信息影暴。后期在穩(wěn)定的運(yùn)行中型宙,其他測(cè)試人員來運(yùn)行也可以很容易上手魂拦,所以大家一定要重視測(cè)試用例的調(diào)試信息。
通過本文荷愕,應(yīng)該知道如何用pytest,logging和--capture=no實(shí)現(xiàn)運(yùn)行測(cè)試用例的實(shí)時(shí)輸出所有的log信息茂契。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末脐雪,一起剝皮案震驚了整個(gè)濱河市战秋,隨后出現(xiàn)的幾起案子癣蟋,更是在濱河造成了極大的恐慌,老刑警劉巖幔欧,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)箍鼓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門奄喂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來富腊,“玉大人,你說我怎么就攤上這事⊙蛞欤” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵菩浙,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我轧苫,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任茁影,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘年扩。我一直安慰自己,他們只是感情好访圃,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布厨幻。 她就那樣靜靜地躺著,像睡著了一般腿时。 火紅的嫁衣襯著肌膚如雪况脆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天批糟,我揣著相機(jī)與錄音格了,去河邊找鬼。 笑死徽鼎,一個(gè)胖子當(dāng)著我的面吹牛盛末,可吹牛的內(nèi)容都是我干的弹惦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼悄但,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼棠隐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起檐嚣,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤助泽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后嚎京,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嗡贺,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年鞍帝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了诫睬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡膜眠,死狀恐怖岩臣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情宵膨,我是刑警寧澤架谎,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站辟躏,受9級(jí)特大地震影響谷扣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜捎琐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一会涎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瑞凑,春花似錦末秃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至技掏,卻和暖如春铃将,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背哑梳。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工劲阎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鸠真。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓悯仙,卻偏偏與公主長(zhǎng)得像龄毡,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子雁比,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理稚虎,服務(wù)發(fā)現(xiàn)撤嫩,斷路器偎捎,智...
    卡卡羅2017閱讀 134,651評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,803評(píng)論 6 342
  • spring官方文檔:http://docs.spring.io/spring/docs/current/spri...
    牛馬風(fēng)情閱讀 1,670評(píng)論 0 3
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,072評(píng)論 25 707
  • 還在用花王滴寶媽們看一下吧 [發(fā)呆][發(fā)呆] 所謂花王屁股 [咖啡]解讀一下所謂的"花王屁股"[得意][得意] 為...
    猴哥媽媽閱讀 1,698評(píng)論 0 7