针对接口测试,选择 JMeter 作为工具,会遇到的问题是,没有合适的分层结构,没有通用的报告模板。
对此,我们的解决方案是:
1、人为定义 JMeter 的层级结构,根据特定结构生成报告。
1、编辑繁琐,需要了解具体结构。
2、勉强能用。
1、JMeter 都会用,通用性强。
2、统一格式方便管理,报告输出合理。
demo
│
├─config //配置中心,存放数据库配置,项目全局变量
│ 配置中心.jmx
├─doc //项目相关文档留存
│ 项目文档.md
├─lib //项目依赖的Jar包
│ fastjson-1.2.62.jar
├─resources //项目引用的外部文件
│ ├─csv
│ └─img
├─testcase //用例层
│ 用例1.jmx
│ 用例2.jmx
├─teststep //步骤层
│ 步骤1.jmx
│ 步骤2.jmx
└─testsuite //场景层,最后可执行的 JMX 文件
模块场景用例.jmx
Tips:
1、JMX 里面引用其他 JMX 可使用 Include Controller,被引用的 JMX 必须是 Test Fragment 。
2、引用的图片,csv,可以使用相对路径,以 JMeter 的 bin 目录为根目录。
3、testSuite 里面的 JMX 才是可以执行的,报告会根据该 JMX 的 名称来解析为模块名称,匹配类型为 ".场景用例.。
在 GUI 里面执行,模块场景用例.jmx,可在查看结果树中进行 jtl 数据写入,需要打开对应配置(Configure 全部勾选即可),记录详细数据。
非 GUI 模式,可使用 -Jjmeter.save.saveservice.label=true
public void setJmeterOutputFormat() {
Properties jmeterProps = JMeterUtils.getJMeterProperties();
jmeterProps.put("jmeter.save.saveservice.label", "true");
jmeterProps.put("jmeter.save.saveservice.response_data", "true");
jmeterProps.put("jmeter.save.saveservice.response_data.on_error", "true");
jmeterProps.put("jmeter.save.saveservice.response_message", "true");
jmeterProps.put("jmeter.save.saveservice.successful", "true");
jmeterProps.put("jmeter.save.saveservice.thread_name", "true");
jmeterProps.put("jmeter.save.saveservice.time", "true");
jmeterProps.put("jmeter.save.saveservice.subresults", "true");
jmeterProps.put("jmeter.save.saveservice.assertions", "true");
jmeterProps.put("jmeter.save.saveservice.latency", "true");
jmeterProps.put("jmeter.save.saveservice.connect_time", "true");
jmeterProps.put("jmeter.save.saveservice.samplerData", "true");
jmeterProps.put("jmeter.save.saveservice.responseHeaders", "true");
jmeterProps.put("jmeter.save.saveservice.requestHeaders", "true");
jmeterProps.put("jmeter.save.saveservice.encoding", "true");
jmeterProps.put("jmeter.save.saveservice.bytes", "true");
jmeterProps.put("jmeter.save.saveservice.url", "true");
jmeterProps.put("jmeter.save.saveservice.filename", "true");
jmeterProps.put("jmeter.save.saveservice.hostname", "true");
jmeterProps.put("jmeter.save.saveservice.thread_counts", "true");
jmeterProps.put("jmeter.save.saveservice.sample_count", "true");
jmeterProps.put("jmeter.save.saveservice.idle_time", "true");
}
生成的 jtl 的 xml 节点数有三层,最外层都是 testResults,里面包含 2 个 Transaction Controller,并且 都勾选 Generate parent samper
// 大概结构如下
<testResults>
<sample TrC>
<sample TrC>
<httpSample>
根据具体结构,就可以自己提取需要的信息。来生成报告模板(报告也是论坛上开源的基础上改了一些)。
{
"testStepNum": 32,
"caseFailNum": 0,
"caseSucessNum": 2,
"stepFailNum": 0,
"testCaseNum": 2,
"stepSucessNum": 32,
"executeTime": 0,
"testModule": {
"模块名称": {
"testCases": [
{
"moduleName": "",
"stepNum": 16,
"caseName": "用例名称", //模块名称
"time": 5357,
"type": "场景", //用例类型
"steps": [ // 步骤列表
{
"cookie": "",
"method": "POST",
"rspSize": 315,
"responseHeader": "",
"responseData": "",
"queryString": "",
"url": "",
"stepName": "", 步骤名称
"assertList": [ //断言结果
{
"failure": false,
"name": "断言响应状态码为200",
"error": false
}
],
"requestHeader": "",
"time": 81,
"status": 0
}
],
"status": "成功" //用例状态,成功或者失败
}
],
"moduleName": "" //模块名称
}
}
}
https://github.com/Laimf1995/JMeter-Report
1、接下来会分享基于统一的 JMeter 工程,来实现平台的对接。
2、基于 JMeter 用例,实现造数据功能。平台负责执行展示。底层 JMX 脚本。