前言

针对接口测试,选择 JMeter 作为工具,会遇到的问题是,没有合适的分层结构,没有通用的报告模板。
对此,我们的解决方案是:
1、人为定义 JMeter 的层级结构,根据特定结构生成报告。

弊端

1、编辑繁琐,需要了解具体结构。
2、勉强能用。

优点

1、JMeter 都会用,通用性强。
2、统一格式方便管理,报告输出合理。

JMeter 用例设计概念

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 脚本。


↙↙↙阅读原文可查看相关链接,并与作者交流