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.rhkb.cn/news/464049.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ElasticSearch - Bucket Script 使用指南

文章目录 官方文档Bucket Script 官文1. 什么是 ElasticSearch 中的 Bucket Script?2. 适用场景3. Bucket Script 的基本结构4. 关键参数详解5. 示例官方示例:计算每月 T 恤销售额占总销售额的比率百分比示例计算:点击率 (CTR) 6. 注意事项与…

java、excel表格合并、指定单元格查找、合并文件夹

#创作灵感# 公司需求 记录工作内容 后端:JAVA、Solon、easyExcel、FastJson2 前端:vue2.js、js、HTML 模式1:合并文件夹 * 现有很多文件夹 想合并全部全部的文件夹的文件到一个文件夹内 * 每个部门发布的表格 合并全部的表格为方便操作 模…

【初阶数据结构篇】链式结构二叉树(二叉链)的实现(感受递归暴力美学)

文章目录 须知 💬 欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力! 👍 点赞、收藏与分享:觉得这篇文章对你有帮助吗&#xff1…

aws(学习笔记第十课) 对AWS的EBS如何备份(snapshot)以及使用snapshot恢复数据,AWS实例存储

aws(学习笔记第十课) 对AWS的EBS如何备份(snapshot)以及使用snapshot,AWS实例存储 学习内容: 对AWS的EBS如何备份AWS实例存储EBS和实例存储的不足 1. 对AWS的EBS如何备份(snapshot)以及使用snapshot恢复数…

适用于 c++ 的 wxWidgets框架源码编译SDK-windows篇

本文章记录了下载wxWidgets源码在windows 11上使用visual Studio 2022编译的全过程,讲的不详细请给我留言,让我知道错误并改进。 本教程是入门级。有更深入的交流可以留言给我。 如今互联网流行现在大家都忘记了这块桌面的开发,我认为桌面应用还是有用武之地,是WEB无法替代…

Pycharm贪吃蛇小游戏后续2

前文中我们提到用面向对象去编写贪吃蛇 目前功能实现贪吃蛇吃食物,身体加长,其次可以按下-(键盘上右分大小写的-,不是数字的-)来改变speed,终端可以看到速度,后续将陆续实现撞墙死亡&#xff0…

你丢失的数据,10款数据恢复软件帮你找!!

现实与虚拟的交错,互联网的进步,加大了我们之间交流的效率,而且便便捷了许许多多的事,比如信息保存;今天咱们来聊聊数据恢复这个话题。你是不是会一不小心删除了重要文件?硬盘出了问题,数据不见…

ArcGIS005:ArcMap常用操作101-150例动图演示

摘要:本文涵盖了GIS软件操作的多方面内容,包括地图文档的新建、打开、保存及版本兼容性处理;错误与警告的查阅及帮助文档的使用技巧;地图打印比例尺的调整与地图信息的完善;图层操作的撤销与恢复,界面元素的…

算法【Java】—— 动态规划之斐波那契数列模型

动态规划 动态规划的思路一共有五个步骤: 状态表示:由经验和题目要求得出,这个确实有点抽象,下面的题目会带大家慢慢感受状态标识状态转移方程初始化:避免越界访问 dp 表,所以在进行填表之前我们要预先填…

【学习】软件测试中的过程管理为何如此重要

在软件世界的繁华盛景之中,无数代码编织成了璀璨的星空,而每一颗闪烁的星点背后,都离不开精心的过程管理来确保其光华不减。正如一座摩天大楼需要稳固的地基与精细的设计图一样,软件的成功问世同样依赖于严谨、系统的流程管控。本…

深入学习 Scrapy 框架:从入门到精通的全面指南

深入学习 Scrapy 框架:从入门到精通的全面指南 引言 在数据驱动的时代,网络爬虫成为了获取信息的重要工具。Scrapy 是一个强大的 Python 爬虫框架,专为快速高效地提取网页数据而设计。本文将深入探讨 Scrapy 的使用,从基础知识到…

【Python】【数据可视化】【商务智能方法与应用】课程 作业一 飞桨AI Studio

作业说明 程序运行和题目图形相同可得90分,图形显示有所变化,美观清晰可适当加分。 import matplotlib.pyplot as plt import numpy as npx np.linspace(0, 1, 100) y1 x**2 y2 x**4plt.figure(figsize(8, 6))# yx^2 plt.plot(x, y1, -., labelyx^2,…

Postgresql源码(137)执行器参数传递与使用

参考 《Postgresql源码(127)投影ExecProject的表达式执行分析》 0 总结速查 prepare p_04(int,int) as select b from tbl_01 where a $1 and b $2为例。 custom计划中,在表达式计算中使用参数的值,因为custom计划会带参数值&…

自适应对话式团队构建,提升语言模型代理的复杂任务解决能力

人工智能咨询培训老师叶梓 转载标明出处 如何有效利用多个大模型(LLM)代理解决复杂任务一直是一个研究热点。由美国南加州大学、宾夕法尼亚州立大学、华盛顿大学、早稻田大学和谷歌DeepMind的研究人员联合提出了一种新的解决方案——自适应团队构建&…

GitHub上传自己的项目

目录 一、安装Git插件 1)下载 2)安装 二、创建Gothub的创库 三、通过Git上传本地文件到Github 四、其他 1、部分指令 2、如果已经运行过git init并设置了[user],下次可以直接用 一、安装Git插件 1)下载 下载地址&#x…

SpringBoot整合EasyExcel加Vue

EasyExcel好处是什么? EasyExcel 是一个基于 Apache POI 的 Java Excel 处理库,主要用于高效地读写 Excel 文件。它的主要好处包括: 高性能:EasyExcel 在内存管理和读取速度上进行了优化,适合处理大规模 Excel 文件。 简洁易用…

VisionPro —— CogPatInspectTool对比工具

一、CogPathInspectTool工具简介 CogPathInspectTool是VisionPro重要的工具,主要用于缺陷检测,通过将当前图像与“训练图像”对比,获取“原始差异图像”,再将“原始差异图像”与“阈值图像”进行对比,进而获取“阈值差…

css实现antd丝带效果

先上效果图&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document…

BFV/BGV全同态加密方案浅析

本文主要为翻译内容&#xff0c;原文地址&#xff1a;Introduction to the BFV encryption scheme、https://www.inferati.com/blog/fhe-schemes-bgv 之前的一篇博客我们翻译了CKKS全同态加密方案的内容&#xff0c;但该篇上下文中有一些知识要点&#xff0c;作者在BFV/BGV中已…

占地1.1万平,2亿投资的智能仓储系统:高架库、AGV、码垛机器人……

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 我国调味料市场近年来展现出惊人的增长潜力&#xff0c;各大品牌纷纷加大投入&#xff0c;力求在竞争中脱颖而出。 广东美味鲜调味食品有限公司&#xff0c;作为行业内的佼佼者&#…