Jmeter——结合Allure展示测试报告

在平时用jmeter做测试时,生成报告的模板,不是特别好。大家应该也知道allure报告,页面美观。

先来看效果图,报告首页,如下所示:

在这里插入图片描述

报告详情信息,如下所示:

在这里插入图片描述

运行run.py文件,运行成功,如下所示:

在这里插入图片描述

接下来来看下实现过程。

安装allure

allure是开源的,直接到github上下载即可。就不细说了。需要注意的是,环境变量的配置,allure的bin路径,需要配置到环境变量path中。

jmeter配置

找到bin目录下的 jmeter.properties 配置文件,将如下所示对应配置取消注释,jmeter.save.saveservice.output_format 修改为xml。

# This section helps determine how result data will be saved.
# The commented out values are the defaults.# legitimate values: xml, csv, db.  Only xml and csv are currently supported.
jmeter.save.saveservice.output_format=xml# The below properties are true when field should be saved; false otherwise
#
# assertion_results_failure_message only affects CSV output
#jmeter.save.saveservice.assertion_results_failure_message=true
#
# legitimate values: none, first, all
#jmeter.save.saveservice.assertion_results=none
#
jmeter.save.saveservice.data_type=true
jmeter.save.saveservice.label=true
jmeter.save.saveservice.response_code=true
# response_data is not currently supported for CSV output
jmeter.save.saveservice.response_data=true
# Save ResponseData for failed samples
jmeter.save.saveservice.response_data.on_error=true
jmeter.save.saveservice.response_message=true
jmeter.save.saveservice.successful=true
jmeter.save.saveservice.thread_name=true
jmeter.save.saveservice.time=true
jmeter.save.saveservice.subresults=true
jmeter.save.saveservice.assertions=true
jmeter.save.saveservice.latency=true
# Only available with HttpClient4
jmeter.save.saveservice.connect_time=true
jmeter.save.saveservice.samplerData=true
jmeter.save.saveservice.responseHeaders=true
jmeter.save.saveservice.requestHeaders=true
jmeter.save.saveservice.encoding=true
jmeter.save.saveservice.bytes=true
# Only available with HttpClient4
jmeter.save.saveservice.sent_bytes=true
jmeter.save.saveservice.url=true
jmeter.save.saveservice.filename=true
jmeter.save.saveservice.hostname=true
jmeter.save.saveservice.thread_counts=true
jmeter.save.saveservice.sample_count=true
jmeter.save.saveservice.idle_time=true# Timestamp format - this only affects CSV output files
# legitimate values: none, ms, or a format suitable for SimpleDateFormat
jmeter.save.saveservice.timestamp_format=ms
jmeter.save.saveservice.timestamp_format=yyyy/MM/dd HH:mm:ss.SSS

生成jmeter结果文件

使用命令 jmeter -n -t C:\Users\Desktop\auth.jmx -l C:\Users\Desktop\result.xml 即可生成xml文件

安装依赖包

按项目中的 requirements.txt 文件,安装对应的依赖包即可。

文件解析生成allure报告

文件解析

xml文件内容如下:

在这里插入图片描述

从上述的内容,我们可以分析得出如下内容:

t 从请求开始到响应结束的时间
ts 表示访问的时刻: date
s 运行的结果
lb 表示标题
rc 返回的响应码
rm 响应信息
tn 线程的名字
assertionResult: 断言信息
responseData/samplerData: 返回数据
queryString: 请求信息

代码实现

利用生成的结果文件生成pytest的参数化数据

try:converte_data = xmltodict.parse(result_file, encoding='utf-8')sample_keys = list(converte_data['testResults'].keys())result = []ws_result = []sample_result = converte_data['testResults']['httpSample'] if isinstance(converte_data['testResults']['httpSample'],list) else [converte_data['testResults']['httpSample']]if 'sample' in sample_keys:ws_result = converte_data['testResults']['sample'] if isinstance(converte_data['testResults']['sample'],list) else [converte_data['testResults']['sample']]result_data = sample_result + ws_resultfor data in result_data:time = data['@t'] if '@t' in data else ''date = data['@ts'] if '@ts' in data else ''status = data['@s'] if '@s' in data else ''title = data['@lb'] if '@lb' in data else ''status_code = data['@rc'] if '@rc' in data else ''status_message = data['@rm'] if '@rm' in data else ''thread = data['@tn'] if '@tn' in data else ''assertion = data['assertionResult'] if 'assertionResult' in data else ''response_data = data['responseData']['#text'] if 'responseData' in data and '#text' in data['responseData'] \else ''sampler_data = data['samplerData']['#text'] if 'samplerData' in data and '#text' in data['samplerData'] \else ''request_data = data['queryString']['#text'] if 'queryString' in data and '#text' in data['queryString'] else ''request_header = data['requestHeader']['#text'] if 'requestHeader' in data and '#text' in data['requestHeader'] else ''request_url = data['java.net.URL'] if 'java.net.URL' in data else ''story = '未标记'assertion_name, assertion_result = None, Noneif status == 'false':assertion_name, assertion_result = get_assertion(assertion)meta_data = (time, date, status, story, title, status_code, status_message, thread, assertion_name, assertion_result,response_data, sampler_data, request_data, request_header, request_url)result.append(meta_data)return result
except Exception as e:print(e)return [('time', 'date', 'true', 'story', 'title', 'status_code', 'status_message', 'thread', 'assertion_name','assertion_result','response_data', 'sampler_data', 'request_data', 'request_header', 'request_url')]

用例详情字段

@allure.step('用例名称:{title}')def title_step(self, title):pass@allure.step('请求信息')def request_step(self, request_url, request_header, request_data, sampler_data):pass@allure.step('断言信息')def assert_step(self, assertion_name, assertion_result):assert False@allure.step('文件信息:{thread}')def file_step(self, thread):pass@allure.step('返回信息')def response_step(self, status_code, status_message, response_data):pass@allure.step('附件(全部信息)')def attach_all(self, data):allure.attach(str(data), name='attach_all_data',attachment_type=allure.attachment_type.JSON)def base_step(self, time, date, status, title, status_code, status_message, thread, assertion_name,assertion_result, response_data,sampler_data, request_data, request_header,request_url):data = {'title': title, 'thread': thread, 'request_url': request_url, 'request_header': request_header,'request_data': request_data, 'sampler_data': sampler_data, 'status_code': status_code,'response_data': response_data, 'assertion_name': assertion_name, 'assertion_resul': assertion_result}self.file_step(thread)self.title_step(title)self.request_step(request_url, request_header, request_data, sampler_data)self.response_step(status_code, status_message, response_data)self.attach_all(data)if status == 'false':self.assert_step(assertion_name, assertion_result)assert Falseelse:assert True@allure.title("{title}")@allure.feature("失败信息")@pytest.mark.parametrize("time,date,status,story,title,status_code,status_message,thread,assertion_name,assertion_result,response_data,sampler_data,request_data,request_header,""request_url",xml_2_data(type=1))def test_gjw(self, time, date, status, story, title, status_code, status_message, thread, assertion_name,assertion_result,response_data, sampler_data, request_data, request_header,request_url):# allure.dynamic.story(story)self.base_step(time, date, status, title, status_code, status_message, thread, assertion_name, assertion_result,response_data,sampler_data, request_data, request_header,request_url)

处理报告转化时间一致

def report_edit(env):path = os.path.join(Path().get_report_path(), env, 'data')# 批量更新聚合文件for file in os.listdir(path):if '.json' in file and 'categories' not in file:try:with open(os.path.join(path, file), 'r') as f:json_str = json.loads(f.read())for data in json_str['children'][0]['children']:name = data['name']for meta in result:if name == meta[3]:data['time']['start'] = int(meta[1])data['time']['stop'] = int(meta[1]) + int(meta[0])data['time']['duration'] = int(meta[0])with open(os.path.join(path, file), 'w') as w:json.dump(json_str, w, indent=2, sort_keys=True, ensure_ascii=False)except Exception as e:print(e)# 批量更新case文件cases_path = os.path.join(path, 'test-cases')for file in os.listdir(cases_path):if '.json' in file and 'categories' not in file:try:with open(os.path.join(cases_path, file), 'r') as f:json_str = json.loads(f.read())name = json_str['name']for meta in result:if name == meta[3]:json_str['time']['start'] = int(meta[1])json_str['time']['stop'] = int(meta[1]) + int(meta[0])json_str['time']['duration'] = int(meta[0])with open(os.path.join(cases_path, file), 'w') as w:json.dump(json_str, w, indent=2, sort_keys=True, ensure_ascii=False)except Exception as e:print(e)

上述只是部分代码,完整代码已上传,JmeterAllureReport ,有兴趣的可以再完善。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

在这里插入图片描述

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!   

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/139850.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

在React中,什么是组件的状态(state)?如何更新组件的状态?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 创建和初始化状态⭐ 更新状态⭐ 注意事项⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前…

【PyTorch攻略(2/7)】 加载数据集

一、说明 PyTorch提供了两个数据原语:torch.utils.data.DataLoader和torch.utils.data.Dataset,允许您使用预加载的数据集以及您自己的数据。数据集存储样本及其相应的标签,DataLoader 围绕数据集包装一个可迭代对象,以便轻松访问…

C++ 共享内存相关的API

C 共享内存相关的API 1.什么是共享内存1.共享内存的概念2.共享内存的原理3.共享内存使用注意点 2.共享内存有关API的操作函数及示例1.新建共享内存-shmget2.连接共享内存到当前的地址空间-shnat3.当前进程分离共享内存shmdt4.控制共享内存-shmctl5.共享内存操作示例 3.共享内存…

Node2Vec实战---《悲惨世界》人物图嵌入

1. pip各个包后导入 import networkx as nx # 图数据挖掘 import numpy as np # 数据分析 import random # 随机数# 数据可视化 import matplotlib.pyplot as plt %matplotlib inline plt.rcParams[font.sans-serif][SimHei] # 用来正常显示中文标签 plt.rcParams[axes.uni…

定制SQLmap和WAF绕过

1. SQLmap tamper 脚本编写 以sqli-lab第26关为例 输入?id1’ --,报错字符型注入 考虑闭合问题,输入?id1’ and 1,但是回显中and和空格消失了,可知and和空格被过滤了 因为and和or被过滤考虑使用双写绕过手段,空格使…

Linux常用命令—find命令大全

文章目录 一、find命令常用功能1、find命令的基本信息如下。2、按照文件名搜索3、按照文件大小搜索4、按照修改时间搜索5、按照权限搜索举例:6、按照所有者和所属组搜索7、按照文件类型搜索8、逻辑运算符 一、find命令常用功能 1、find命令的基本信息如下。 命令名…

java:java.util.MissingResourceException: Cant find bundle for base name解决方式

java:java.util.MissingResourceException: Cant find bundle for base name解决方式 1 前言 代码执行如下: ResourceBundle.getBundle("res.Message",Locale.getDefault(), ReadMyProps.class.getClassLoader());或 ResourceBundle.getBu…

(25)(25.1) 光学流量传感器的测试和设置

文章目录 25.1.1 测试传感器 25.1.2 校准传感器 25.1.3 测距传感器检查 25.1.4 预解锁检查 25.1.5 首次飞行 25.1.6 第二次飞行 25.1.7 正常操作设置 25.1.8 视频示例(Copter-3.4) 25.1.9 空中校准 25.1.1 测试传感器 将传感器连接至自动驾驶仪…

ROS2 从头开始:第 8 部分 - 使用 ROS2 生命周期节点简化机器人软件组件管理

一、说明 欢迎来到我在 ROS2 上的系列的第八部分。对于那些可能不熟悉该系列的人,我已经涵盖了一系列主题,包括 ROS2 简介、如何创建发布者和订阅者、自定义消息和服务创建、组合和执行器以及 DDS 和 QoS 配置。如果您还没有机会查看以前的帖子&#xff…

2023华为杯数学建模D题第三问——区域双碳目标情景设计样例

在第二问建立好预测模型的基础上,如何设计第三问所说的区域双碳路径,以对宏观政策进行指导! 采用STIRPA的基本模型对中国碳达峰时间进行预测,对该模型公式两边取对数得到: 其中:P为人口,A为GDP…

异常记录-VS

1.文件加载失败 无法找到指定路径 Frame GUID: a6c744a8-0e4a-4fc6- 886a-064283054674 Frame mode: VSFM_ MdiChild Error code: 0x80131515 未理会这个提示,可以打开运行项目,只是会跳出这个弹窗。 无法关闭这个异常的窗口。

十四、MySql的用户管理

文章目录 一、用户管理二、用户(一)用户信息(二)创建用户1.语法:2.案例: (三) 删除用户1.语法:2.示例: (四)修改用户密码1.语法&#…

【MT7628AN】IOT | MT7628AN OpenWRT开发与学习

IOT | MT7628AN OpenWRT开发与学习 时间:2023-06-21 文章目录 `IOT` | `MT7628AN` `OpenWRT`[开发与学习](https://blog.csdn.net/I_feige/article/details/132911634?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22132911634…

【C语言】指针的进阶(四)—— 企业笔试题解析

笔试题1: int main() {int a[5] { 1, 2, 3, 4, 5 };int* ptr (int*)(&a 1);printf("%d,%d", *(a 1), *(ptr - 1));return 0; } 【答案】在x86环境下运行 【解析】 &a是取出整个数组的地址,&a就表示整个数组,因此…

vue项目打包优化

首先第一步通过浏览器看首次加载的问题大小,时间跨度等方面入手 1. Coverage观察 Coverage是chrome开发者工具的一个新功能,从字面意思上可以知道它是可以用来检测代码在网站运行时有哪些js和css是已经在运行,而哪些js和css是还没有用到的&a…

WEB使用VUE3实现地图导航跳转

我们在用手机查看网页时可以通过传入经纬度去设置目的地然后跳转到对应的地图导航软件,如果没有下载软件则会跳转到下载界面 注意: 高德地图是一定会跳转到一个新网页然后去询问用户是否需要打开软件百度和腾讯地图是直接调用软件的这个方法有缺陷&…

【c#-Nuget 包“在此源中不可用”】 Nuget package “Not available in this source“

标题c#-Nuget 包“在此源中不可用”…但 VS 仍然知道它吗? (c# - Nuget package “Not available in this source”… but VS still knows about it?) 背景: 今日从公司svn 上拉取很久很久以前的代码,拉取下来200报错,进一步发…

【机器学习】文本多分类

声明:这只是浅显的一个小试验,且借助了AI。使用的是jupyter notebook,所以代码是一块一块,从上往下执行的 知识点:正则删除除数字和字母外的所有字符、高频词云、混淆矩阵 参考:使用python和sklearn的中文文本多分类…

资源分享 | 情绪脑电研究公开数据集

SEED SEED数据集是由上海交大类脑计算与机器智能研究中心(BCMI)开发的。该数据集是基于脑电的情绪分类任务而设计的数据集。该数据集记录了15名被试在观看积极、中性和消极情绪电影片段时的EEG信号,每个视频片段的时间为3-5分钟。每个参与者重复采集三天&#xff0…

多分类中混淆矩阵的TP,TN,FN,FP计算

关于混淆矩阵,各位可以在这里了解:混淆矩阵细致理解_夏天是冰红茶的博客-CSDN博客 上一篇中我们了解了混淆矩阵,并且进行了类定义,那么在这一节中我们将要对其进行扩展,在多分类中,如何去计算TP&#xff0…