在平时用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_result
for 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, None
if 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 False
else:
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 ,有兴趣的可以再完善。

Jmeter——结合Allure展示测试报告的更多相关文章

  1. pytest+allure展示环境信息

    allure展示环境信息 要将信息添加到Environment小部件,只需在生成报告之前在目录中创建environment.properties(或environment.xml)文件allure-r ...

  2. Pytest测试框架(五):pytest + allure生成测试报告

    Allure 是一款轻量级.支持多语言的开源自动化测试报告生成框架,由Java语言开发,可以集成到 Jenkins. pytest 测试框架支持Allure 报告生成. pytest也可以生成juni ...

  3. pytest(11)-Allure生成测试报告(一)

    Allure是一个开源的测试报告生成框架,提供了测试报告定制化功能,相较于我们之前使用过pytest-html插件生成的html格式的测试报告,通过Allure生成的报告更加规范.清晰.美观. pyt ...

  4. Allure自动化测试报告我是这样用的

    关于自动化测试报告: 之前用过testNG自带的测试报告.优化过reportNG的测试报告.extentreport.Zreport(大飞总原创),这些是我之前都用过的,也是在去年雯姐和我说过Allu ...

  5. Allure自动化测试报告之修改allure测试报告名称

    1.从github获取allure代码 https://github.com/allure-framework/allure2 2.安装gradle,用于打包jar brew install grad ...

  6. python + pytest + allure生成测试报告

    pytest结合allure生成测试报告 环境搭建 要安装java环境,版本要是jdk1.8的,配置好java环境变量,不然输入allure命令会报错,JAVA_HOME环境,自行配置 安装allur ...

  7. pytest+jenkins+allure 生成测试报告发送邮件

    前言第一部分:Pycharm for Gitee1. pycharm安装gitee插件2. gitee关联本地Git快速设置- 如果你知道该怎么操作,直接使用下面的地址简易的命令行入门教程:3. Gi ...

  8. python自动化之使用allure生成测试报告

    Allure测试报告框架帮助你轻松实现"高大上"报告展示.本文通过示例演示如何从0到1集成Allure测试框架.重点展示了如何将Allure集成到已有的自动化测试工程中.以及如何实 ...

  9. Pytest使用pytest-html和allure生成测试报告

    Pytest-html 1.安装命令pip3 install pytest-html,如下图: 执⾏后,会在当前⽬录下⽣成 ⼀个report.html的⽂件,打开后会展示详细的测试报告,执行该命令py ...

  10. Jmeter生成html格式测试报告

    使用jmeter进行性能测试,运行完毕后生成html格式的测试报告,需要进行如下操作: 1.在C:\apache-jmeter-3.0\bin文件夹下的user.properties文本中添加如下信息 ...

随机推荐

  1. Compass- 图形化界面客户端

    到MongoDB官网下载MongoDB Compass, 地址: https://www.mongodb.com/download-center/v2/compass?initial=true 如果是 ...

  2. 面试突击86:SpringBoot 事务不回滚?怎么解决?

    在 Spring Boot 中,造成事务不自动回滚的场景有很多,比如以下这些: 非 public 修饰的方法中的事务不自动回滚: 当 @Transactional 遇上 try/catch 事务不自动 ...

  3. [CG从零开始] 4. pyopengl 绘制一个正方形

    在做了 1-3 的基础工作后,我们的开发环境基本 OK 了,我们可以开始尝试利用 pyopengl 来进行绘制了. 本文主要有三个部分 利用 glfw 封装窗口类,并打开窗口: 封装 shader 类 ...

  4. PHP实践项目【1】:注册登录页面

    在我们这个项目里面,一共用到了5个php文件,他们分别是: login.php 登录页面 logincheck.php 登录检测php文件 register.php 新用户注册页面 regcheck. ...

  5. 文件管理工具“三剑客” #Everything #SpaceSniffer #Clover

    前言: 本文收集了我日常使用的三个文件管理工具: 文件搜索神器--Everything 磁盘文件占用分析工具--SpaceSniffer 文件资源管理器--Clover 下面我从工具解决的痛点和使用技 ...

  6. 如何去了解Spring

    对于你想了解的技术 官方总是一个合适的选择 首先,我们所指的Spring 一般指的是Spring Framework,伴随着的时代的进步,Spring全家桶也逐渐完善起来 Spring 1.Why S ...

  7. JVM运行模式和逃逸分析

    JVM三种运行模式: 解释模式(Interpreted Mode):只使用解释器(-Xint强制JVM使用解释模式),执行一行JVM字节码就编译一行为机器码.(可以马上看到效果,但是运行过程比较慢) ...

  8. spring boot+vue前后端项目的分离(我的第一个前后端分离项目)

    文章目录 1.前端vue的搭建 2.后端项目的构建 pom文件中引入的jar包 yml文件用来配置连接数据库和端口的设置 application.property进行一些整合 controller层( ...

  9. C语言表白窗口程序

    #include<windows.h> #include<stdio.h> #include<string.h> int main() { char modeCom ...

  10. 知识图谱顶会论文(SIGIR-2022) MorsE:归纳知识图嵌入的元知识迁移

    MorsE:归纳知识图嵌入的元知识迁移 论文题目: Meta-Knowledge Transfer for Inductive Knowledge Graph Embedding 论文地址: http ...