今天我們?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)安裝好了的纤子,所以你看到的輸出信息可能和我的不太一樣
驗(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è)試用例
沒錯(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
解壓
下載完后解壓到我們項(xiàng)目根目錄下奈辰,也就是需要運(yùn)行pytest代碼的目錄下奖恰。下面是我的項(xiàng)目根目錄
modify by linux超 at 2019.08.30
可以解壓到任意目錄
安裝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)告
效果
這個(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)告