首页 > 其他分享 >【Pytest--html报告优化+增加错误截图,获取统计数据】

【Pytest--html报告优化+增加错误截图,获取统计数据】

时间:2022-12-18 18:00:50浏览次数:48  
标签:terminalreporter -- driver html 用例 Pytest pytest report

一、pytest生成的原始html报告

【Pytest--html报告优化+增加错误截图,获取统计数据】_用例

1、在我们实际工作中,环境信息不一定要在报告中详细提现,可以增减
2、用例信息,默认展示的是用例的model名::用例名称,并不直观,所以我们可以增加一个用例描述,直观描述用例的测试内容
3、links列没有用到,可以删除
4、logs的作用往往是为了报错或者用例执行失败后调试用的,所以在用例稳定运行且成功的情况下可以去掉。
接下来我们就来针对以上4点,对我们的测试报告进行优化

二、测试报告优化

测试报告格式优化,所有内容均需要在conftest.py中配置
首先引入以下包

from py.xml import html
import pytest

1、环境信息增减

conftest.py中增加以下代码,具体需要增加和去除的信息根据个人需要调整

1.1、修改Environment项目展示的信息

def pytest_configure(config):
# 添加项目名称
config._metadata["项目名称"] = "钣喷车间小程序测试"
# 删除Java_Home
config._metadata.pop("JAVA_HOME")
# 删除Plugins
config._metadata.pop("Plugins")

1.2、添加Summary项目展示的信息

@pytest.mark.optionalhook
def pytest_html_results_summary(prefix): #添加summary内容
prefix.extend([html.p("所属部门: 测试组")])
prefix.extend([html.p("测试人员: 李晓良")])

1.3、效果展示

【Pytest--html报告优化+增加错误截图,获取统计数据】_用例_02


2、增加用例描述和去除link列

@pytest.mark.optionalhook
def pytest_html_results_table_header(cells):
cells.insert(1, html.th('Description')) # 表头添加Description
cells.pop(-1) # 删除link


@pytest.mark.optionalhook
def pytest_html_results_table_row(report, cells):
cells.insert(1, html.td(report.description)) #表头对应的内容
cells.pop(-1) # 删除link列


@pytest.mark.hookwrapper
def pytest_runtest_makereport(item, call): #description取值为用例说明__doc__
outcome = yield
report = outcome.get_result()
report.description = str(item.function.__doc__)

注:用例的description取值为对应用例的说明

【Pytest--html报告优化+增加错误截图,获取统计数据】_html_03

效果展示:

【Pytest--html报告优化+增加错误截图,获取统计数据】_html_04

3、去除执行成功用例的log输出

@pytest.mark.optionalhook
def pytest_html_results_table_html(report, data): #清除执行成功的用例logs
if report.passed:
del data[:]
data.append(html.div('自定义用例pass展示的log.', class_='empty log'))

增加以上代码输出的测试报告,如果用例执行通过,则不会展示log,会展示自己定义的输出。


【Pytest--html报告优化+增加错误截图,获取统计数据】_测试报告_05

==================================================================================================================================================================================================================================================

接下来讲:

pytest--html报告优化(增加错误截图,获取统计数据)

一、html报告增加错误截图

应用场景

在我们做UI自动化时,往往在用例执行失败时通过设定的log来进行错误分析,来优化代码或者确定问题,测试报告也默认只有log的展示。如果我们在用例执行失败时能进行当前页面的截图,并且将截图直接呈现在测试报告中的话,是不是可以帮助我们更直观的定位到问题呢?

实现方式

同样是在conftest.py中进行配置:

'''用例失败截图'''
@pytest.mark.hookwrapper
def pytest_runtest_makereport(item):
"""
当测试失败的时候,自动截图,展示到html报告中
: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类中取出driver属性的值作为实际的driver
return driver.get_screenshot_as_base64()

注意:
1、以上screenshot_base64()方法中所用到的driver为当前执行UI自动化时启动的driver,获取的方式可以是在启动driver时将之设置为全局变量直接调用,或者像我那样用setattr将driver存储起来,在用到的地方再用getattr将之取出,可以实现跨模块的调用,具体请学习getattr和setattr 的基本用法。下面是赋值的代码

class GetData():
homework_page_stateText=None
summary = None
driver = None

@pytest.fixture(scope="module")
def startMiniProgram():
"启动小程序,返回driver,运行结束后关闭小程序,模块级别的前后置操作"
driver = baseDriver()
sleep(5)
# 切换到工作台首页
CommBus(driver).switchTo_miniProgram()
setattr(GetData,'driver',driver) #将driver赋值给自定义的GetData类的driver属性
yield (driver)
sleep(2)
CommBus(driver).close_miniProgram()

效果展示:

【Pytest--html报告优化+增加错误截图,获取统计数据】_html_06


二、获取用例执行的统计数据

应用场景

【Pytest--html报告优化+增加错误截图,获取统计数据】_html_07


以上为测试报告中的统计数据,有时我们可能想直接把统计数据提取出来,单独发送邮件时展示,或者作为直观的执行结果进行传递,而不需要别人要打开测试报告才能看到。那这个时候我们应该怎么做呢?

实现方式

同样是在conftest.py中进行配置:

def pytest_terminal_summary(terminalreporter, exitstatus, config):
'''收集测试结果'''
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')) + '秒' #时间取2位小数,单位为秒

count = f'本次用例执行结果概览:\n\n用例合计数:-----{total}\n执行通过数:-----{passed}\n执行失败数:-----{failed}\n执行报错数:-----{error}\n跳过用例数:-----{skipped}\n执行成功率:-----{pass_rate}%\n运行总耗时:-----{total_times}\n\n详细测试报告请查阅附件'
setattr(GetData,'summary' ,count) #将组装好的summary文本内容赋值给GetData类的 summary属性,已供其他地方调用

在需要用到统计数据的地方直接调用


getattr(GetData, 'summary')

就可以把统计数据获取到。

效果展示(邮件正文发送):

【Pytest--html报告优化+增加错误截图,获取统计数据】_用例_08



标签:terminalreporter,--,driver,html,用例,Pytest,pytest,report
From: https://blog.51cto.com/u_15874356/5950945

相关文章

  • 浅谈入行Qt桌面端开发程序员-从毕业到上岗(1):当我们说到桌面端开发时,我们在谈论什么?
    谈谈我自己大家好,我是轩先生,是一个刚入行的Qt桌面端开发程序员。我的本科是双非一本的数学专业,22年毕业,只是部分课程与计算机之间有所交叉,其实在我毕业的时候并没有想过会......
  • 如何实现chrome谷歌浏览器多开(独立环境 独立cookie)
    由于各种各样的原因,你可能需要在一个电脑登录某个平台,比如一个电脑登录3个公众号,或者3个知乎等等。最简单的方案是,直接安装3个不同的浏览器,比如一个谷歌浏览器,一个火狐浏......
  • 【LeeCode】338. 比特位计数
    【题目描述】给你一个整数 ​​n​​ ,对于 ​​0<=i<=n​​ 中的每个 ​​i​​ ,计算其二进制表示中 ​​1​​​​ 的个数 ,返回一个长度为 ​​​n+1​​......
  • 容器与虚拟机对比
    大致对比一下容器与虚拟机的特点。对比1.隔离注:这里的隔离与否主要看使用效果,而不关注实现细节。容器虚拟机硬件隔离隔离进程隔离隔离文件系统......
  • go语言20小时从入门到精通(一、初识Go语言)
    1.1Go语言介绍1.1.1Go语言是什么2009年11月10日,Go语言正式成为开源编程语言家庭的一员。Go语言(或称Golang)是云计算时代的C语言。Go语言的诞生是为了让程序员有更高的生产......
  • 实验七-缓冲区溢出
    实验七-缓冲区溢出 实验指导书内容一、实验简介   缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况。这一漏洞可以被恶意用户利用来改变程序的......
  • 有点乱
    我需要补一些电脑硬件方面的知识了,毕竟台式电脑要比笔记本实惠不少,而且也并不是不能满足我的需要。反思我最近是不是有点乱,提到这个我却感到很惭愧,因为理想的状况应该是有......
  • 抗阳随记
    2019年12月到2022年12月6日新十条发布的全面放开,整整3年,疫情的帷幕渐渐落地~我也很“幸运”的成了第一批中招的人,这是个有点儿头疼、眼睛疼、胳膊腿和嗓子眼都疼的故事:20......
  • 更新一波
    又决定更新了,虽然写这个博客还是各种麻烦,就像在有打火机的时代还去钻木取火一样......为什么又来更新了呢,因为此刻心情好一点吧。虽然我现在的处境并不开心...唉...想说......
  • CSharp: Mediator Pattern in donet core 6
     ///<summary>///中介者模式MediatorPattern亦称:调解人、控制器、Intermediary、Controller、Mediator///</summary>publicabstractclassUser......