一螟碎、html報(bào)告增加錯(cuò)誤截圖
應(yīng)用場(chǎng)景
在我們做UI自動(dòng)化時(shí),往往在用例執(zhí)行失敗時(shí)通過(guò)設(shè)定的log來(lái)進(jìn)行錯(cuò)誤分析迹栓,來(lái)優(yōu)化代碼或者確定問(wèn)題抚芦,測(cè)試報(bào)告也默認(rèn)只有l(wèi)og的展示。如果我們?cè)谟美龍?zhí)行失敗時(shí)能進(jìn)行當(dāng)前頁(yè)面的截圖,并且將截圖直接呈現(xiàn)在測(cè)試報(bào)告中的話叉抡,是不是可以幫助我們更直觀的定位到問(wèn)題呢?
實(shí)現(xiàn)方式
同樣是在conftest.py中進(jìn)行配置
'''用例失敗截圖'''
@pytest.mark.hookwrapper
def pytest_runtest_makereport(item):
"""
當(dāng)測(cè)試失敗的時(shí)候尔崔,自動(dòng)截圖,展示到html報(bào)告中
:param item:
"""
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 = screenshot_base64()
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
report.description = str(item.function.__doc__)
def screenshot_base64():
'''
截圖保存為base64褥民,展示到html中
:return:
'''
driver = getattr(GetData,'driver') #從GetData類(lèi)中取出driver屬性的值作為實(shí)際的driver
return driver.get_screenshot_as_base64()
注意:
1季春、以上screenshot_base64()方法中所用到的driver為當(dāng)前執(zhí)行UI自動(dòng)化時(shí)啟動(dòng)的driver,獲取的方式可以是在啟動(dòng)driver時(shí)將之設(shè)置為全局變量直接調(diào)用消返,或者像我那樣用setattr將driver存儲(chǔ)起來(lái)载弄,在用到的地方再用getattr將之取出,可以實(shí)現(xiàn)跨模塊的調(diào)用撵颊,具體請(qǐng)學(xué)習(xí)getattr和setattr 的基本用法宇攻。下面是賦值的代碼
class GetData():
homework_page_stateText=None
summary = None
driver = None
@pytest.fixture(scope="module")
def startMiniProgram():
"啟動(dòng)小程序,返回driver倡勇,運(yùn)行結(jié)束后關(guān)閉小程序逞刷,模塊級(jí)別的前后置操作"
driver = baseDriver()
sleep(5)
# 切換到工作臺(tái)首頁(yè)
CommBus(driver).switchTo_miniProgram()
setattr(GetData,'driver',driver) #將driver賦值給自定義的GetData類(lèi)的driver屬性
yield (driver)
sleep(2)
CommBus(driver).close_miniProgram()
效果展示:
二、獲取用例執(zhí)行的統(tǒng)計(jì)數(shù)據(jù)
應(yīng)用場(chǎng)景
以上為測(cè)試報(bào)告中的統(tǒng)計(jì)數(shù)據(jù)妻熊,有時(shí)我們可能想直接把統(tǒng)計(jì)數(shù)據(jù)提取出來(lái)夸浅,單獨(dú)發(fā)送郵件時(shí)展示,或者作為直觀的執(zhí)行結(jié)果進(jìn)行傳遞扔役,而不需要?jiǎng)e人要打開(kāi)測(cè)試報(bào)告才能看到帆喇。那這個(gè)時(shí)候我們應(yīng)該怎么做呢?
實(shí)現(xiàn)方式
同樣是在conftest.py中進(jìn)行配置
def pytest_terminal_summary(terminalreporter, exitstatus, config):
'''收集測(cè)試結(jié)果'''
total = terminalreporter._numcollected
passed = len([i for i in terminalreporter.stats.get('passed', []) if i.when != 'teardown'])
failed = len([i for i in terminalreporter.stats.get('failed', []) if i.when != 'teardown'])
error = len([i for i in terminalreporter.stats.get('error', []) if i.when != 'teardown'])
skipped = len([i for i in terminalreporter.stats.get('skipped', []) if i.when != 'teardown'])
pass_rate = format(len(terminalreporter.stats.get('passed', []))/terminalreporter._numcollected*100, '.2f')
duration = time.time() - terminalreporter._sessionstarttime
total_times = str(format(duration,'.2f')) + '秒' #時(shí)間取2位小數(shù)亿胸,單位為秒
count = f'本次用例執(zhí)行結(jié)果概覽:\n\n用例合計(jì)數(shù):-----{total}\n執(zhí)行通過(guò)數(shù):-----{passed}\n執(zhí)行失敗數(shù):-----{failed}\n執(zhí)行報(bào)錯(cuò)數(shù):-----{error}\n跳過(guò)用例數(shù):-----{skipped}\n執(zhí)行成功率:-----{pass_rate}%\n運(yùn)行總耗時(shí):-----{total_times}\n\n詳細(xì)測(cè)試報(bào)告請(qǐng)查閱附件'
setattr(GetData,'summary' ,count) #將組裝好的summary文本內(nèi)容賦值給GetData類(lèi)的 summary屬性坯钦,已供其他地方調(diào)用
在需要用到統(tǒng)計(jì)數(shù)據(jù)的地方直接調(diào)用
getattr(GetData, 'summary')
就可以把統(tǒng)計(jì)數(shù)據(jù)獲取到。