pytest-html

今天我們?cè)賮?lái)說說pytest如何生成一個(gè)完整的html測(cè)試報(bào)告,讓你在吹牛逼的路上再多一份資本!廢話不多說,進(jìn)入正題9薄(咋就莫名其妙想起這句話了呢帽芽, 估計(jì)看文章看多了,貌似挺多人用這句話過度……)

使用pytest-html插件生成測(cè)試報(bào)告

pytest-html生成報(bào)告

pytest是借助pytest-html插件生成測(cè)試測(cè)試報(bào)告翔冀, 不用自己編寫生成報(bào)告代碼导街。github源碼地址 https://github.com/pytest-dev/pytest-html

安裝

與安裝python第三方庫(kù)一樣使用pip命令->pip install pytest-html,我這邊是已經(jīng)安裝好了的纤子,所以你看到的輸出信息可能和我的不太一樣

image

驗(yàn)證安裝

使用pip list 可以查看是否有pytest-html搬瑰,如果有表示已經(jīng)安裝成功

生成報(bào)告

使用命令 pytest --html=reportname.html (這里的參數(shù)是測(cè)試報(bào)告的名稱,注意前面是兩個(gè)橫杠)我們嘗試一下 控硼!

效果
image

可以看到這個(gè)報(bào)告還是挺不錯(cuò)的泽论,比unittest那個(gè)報(bào)告炫了很多翼悴!每一個(gè)case都可點(diǎn)開查看具體的運(yùn)行信息! 好了幔妨,大家可能發(fā)現(xiàn)你生成的測(cè)試報(bào)告和我這個(gè)貌似有哪里不一樣?是的误堡,沒錯(cuò),我這里多了描述信息你那里好像不存在陪踩,先不急杖们。

錯(cuò)誤用例截圖

通常膊毁,我們希望測(cè)試用例失敗的時(shí)候能夠截取一張圖片,這樣我們可以知道哪里出了問題或者出現(xiàn)問題的大概位置婚温,方便我們調(diào)試代碼或者分析軟件的bug,那么又該如何在這一份報(bào)告里面插入截圖呢栅螟?

上篇文章我們提到了conftest.py文件荆秦,那么我們現(xiàn)在就可以把失敗截圖的代碼放到這個(gè)文件里面了(為什么放在這里,我想學(xué)會(huì)的同學(xué)應(yīng)該知道力图,不知道的看前面文章吧)步绸,看具體代碼!

import pytest
from selenium import webdriver
from py._xmlgen import html

_driver = None
# 測(cè)試失敗時(shí)添加截圖和測(cè)試用例描述(用例的注釋信息)

@pytest.mark.hookwrapper
def pytest_runtest_makereport(item):
    """當(dāng)測(cè)試失敗的時(shí)候吃媒,自動(dòng)截圖瓤介,展示到html報(bào)告中"""
    pytest_html = item.config.pluginmanager.getplugin('html')
    outcome = yield
    report = outcome.get_result()
    extra = getattr(report, 'extra', [])

    if report.when == 'call' or report.when == "setup":
        xfail = hasattr(report, 'wasxfail')
        if (report.skipped and xfail) or (report.failed and not xfail):
            file_name = report.nodeid.replace("::", "_")+".png"
            screen_img = _capture_screenshot()
            if file_name:
                html = '<div><img src="data:image/png;base64,%s" alt="screenshot" style="width:600px;height:300px;" ' \
                       'onclick="window.open(this.src)" align="right"/></div>' % screen_img
                extra.append(pytest_html.extras.html(html))
        report.extra = extra

def _capture_screenshot():
    '''截圖保存為base64'''
    return _driver.get_screenshot_as_base64()

@pytest.fixture(scope='module')
def driver():
    global _driver
    print('------------open browser------------')
    _driver = webdriver.Firefox()

    yield _driver
    print('------------close browser------------')
    _driver.quit()

注意這個(gè)模塊from py._xmlgen import html,我們網(wǎng)上看到大多數(shù)是使用 from py.xml import html,我使用這個(gè)模塊時(shí)會(huì)報(bào)錯(cuò)赘那,所以換成現(xiàn)在這個(gè)模塊了(估計(jì)和python版本有關(guān)系刑桑,我用的3,3估計(jì)沒有這個(gè)模塊了)募舟。

好了, 現(xiàn)在我們?cè)趤?lái)執(zhí)行一下我們的測(cè)試用例

image

沒錯(cuò)祠斧,失敗用例有了圖片了,而且很清晰拱礁。我用例斷言的是登錄失敗時(shí)的錯(cuò)誤提示信息是否正確(為了演示琢锋,我把用例里面期望值改了),實(shí)際提示信息是‘賬號(hào)和密碼錯(cuò)誤’和‘請(qǐng)輸入賬號(hào)’呢灶,但是我們期望的是‘賬號(hào)和密碼錯(cuò)’和‘請(qǐng)輸入賬’吴超,很明顯我們的軟件是存在bug的,一目了然鸯乃!是不是很實(shí)用……接下來(lái)我們?cè)賮?lái)看看如何添加描述信息的烛芬。

添加描述

正常情況下,我們的報(bào)告是沒有描述信息這一項(xiàng)的飒责,所以我們只能通過添加代碼來(lái)實(shí)現(xiàn)了(描述信息就是我們用例函數(shù)上方的注釋信息)赘娄。通過官方的文檔說明,我們知道是可以添加和刪除報(bào)告的table表的

我們?cè)谏厦娴拇a report.extra = extra 后面添加這樣一行代碼

report.description = str(item.function.__doc__)

并在文件中添加這兩個(gè)方法

@pytest.mark.optionalhook
def pytest_html_results_table_header(cells):
    cells.insert(1, html.th('Description'))

@pytest.mark.optionalhook
def pytest_html_results_table_row(report, cells):
    cells.insert(1, html.td(report.description))

我們可以試著再次運(yùn)行我們的測(cè)試用例宏蛉,看看報(bào)告效果應(yīng)該就和我的一樣了遣臼。

小結(jié)

大家可以把代碼寫一遍然后自己試試,是否會(huì)得到我們想要的報(bào)告拾并,其實(shí)這篇文章并沒有詳細(xì)講解代碼編寫過程揍堰,也沒有詳細(xì)說明哪段代碼是用來(lái)干什么的鹏浅,因?yàn)檫@些代碼就是個(gè)模板,也是通用的屏歹,所以大家保存下來(lái)即可隐砸,以后編寫項(xiàng)目的時(shí)候直接哪里用就可以了(作為一個(gè)python程序員,終極思想就是能簡(jiǎn)化就簡(jiǎn)化蝙眶,能簡(jiǎn)單寫代碼就簡(jiǎn)單寫代碼季希,能copy就copy幽纷,嗯友浸,就是這樣!)

allure2生成報(bào)告

這個(gè)就厲害了,我本人覺得這個(gè)工具真的是超級(jí)牛逼武学,生成的報(bào)告也超級(jí)炫酷火窒。實(shí)際上它是一個(gè)report框架,支持各種語(yǔ)言的各種測(cè)試框架括勺,而且可以集成到j(luò)enkins上使用

安裝allure

github上下載最新版本https://github.com/allure-framework/allure2/releases

image

解壓

下載完后解壓到我們項(xiàng)目根目錄下奈辰,也就是需要運(yùn)行pytest代碼的目錄下奖恰。下面是我的項(xiàng)目根目錄

modify by linux超 at 2019.08.30

可以解壓到任意目錄

image

安裝pytest-allure-adaptor插件

pip install allure-pytest

生成xml格式報(bào)告

在我們需要運(yùn)行用例的目錄下執(zhí)行 pytest -s -q --alluredir ./report(當(dāng)前目錄下的report文件夾瑟啃,這個(gè)文件夾名字蛹屿,可以自己指定位置错负,不指定默認(rèn)生成在當(dāng)前目錄下)

添加環(huán)境變量

把a(bǔ)llure-2.10.0\bin目錄添加到環(huán)境變量,當(dāng)然你也可以不添加折联,我們添加環(huán)境變量的目的是可以在任意位置執(zhí)行bin目錄下allure.bat腳本

運(yùn)行allure生成報(bào)告

前面我們已經(jīng)通過這個(gè)命令pytest -s -q --alluredir report 生成了xml格式的報(bào)告诚镰,保存在了report下谊囚,接著我們執(zhí)行命令allure generate report/ -o report/html镰踏,第一個(gè)report就是指定之前xml報(bào)告的目錄,后面的report也可以自己指定在哪個(gè)目錄生成最終的html報(bào)告跌帐,我們按下面的路徑找到我們的報(bào)告谨敛,看下生成的報(bào)告效果

modify by linux超 at 2019.08.30

注意:report目錄不能相同脸狸,必須指定一個(gè)空的目錄生成最后的html報(bào)告

image

效果

image

這個(gè)報(bào)告看起來(lái)真的很炫酷炊甲,而且左邊的菜單都可以點(diǎn)開卿啡,里面記錄了們的用例執(zhí)行的情況颈娜,好了大家試試吧官辽!

總結(jié)

主要內(nèi)容

1.pytest-html插件生成測(cè)試報(bào)告野崇,及用例失敗時(shí)如何截取圖片添加到報(bào)告里亩钟,如何添加用例描述到報(bào)告里

2.如何使用allure生成測(cè)試報(bào)告

以上兩種生成測(cè)試報(bào)告的方式,希望可以幫到大家扶镀,并把這些技能運(yùn)用到我們實(shí)際的工作當(dāng)中臭觉!

轉(zhuǎn)載自:Python 進(jìn)階之html生成報(bào)告

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末狞膘,一起剝皮案震驚了整個(gè)濱河市什乙,隨后出現(xiàn)的幾起案子臣镣,更是在濱河造成了極大的恐慌,老刑警劉巖点待,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件癞埠,死亡現(xiàn)場(chǎng)離奇詭異苗踪,居然都是意外死亡徒探,警方通過查閱死者的電腦和手機(jī)喂窟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門磨澡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)稳摄,“玉大人厦酬,你說我怎么就攤上這事〔玻” “怎么了短绸?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵醋闭,是天一觀的道長(zhǎng)朝卒。 經(jīng)常有香客問我扎运,道長(zhǎng),這世上最難降的妖魔是什么洞拨? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任烦衣,我火速辦了婚禮花吟,結(jié)果婚禮上衅澈,老公的妹妹穿的比我還像新娘今布。我一直安慰自己拭抬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般犁功。 火紅的嫁衣襯著肌膚如雪波桩。 梳的紋絲不亂的頭發(fā)上请敦,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天萤皂,我揣著相機(jī)與錄音匣椰,去河邊找鬼。 笑死入录,一個(gè)胖子當(dāng)著我的面吹牛僚稿,可吹牛的內(nèi)容都是我干的蟀伸。 我是一名探鬼主播啊掏,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼迟蜜,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼娜睛!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起酸茴,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎笼痹,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晴裹,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了泌绣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖苗沧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情待逞,我是刑警寧澤识樱,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站翁巍,受9級(jí)特大地震影響休雌,放射性物質(zhì)發(fā)生泄漏杈曲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一恰响、第九天 我趴在偏房一處隱蔽的房頂上張望胚宦。 院中可真熱鬧,春花似錦井联、人聲如沸您旁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蝗锥。三九已至终议,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間穴张,已是汗流浹背两曼。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工偿枕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人渐夸。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓墓塌,卻偏偏與公主長(zhǎng)得像苫幢,于是被迫代替她去往敵國(guó)和親韩肝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

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