一、实现原理

使用 ant 任务批量跑指定目录下的 Jmeter 脚本,在 jmeter.properties 配置输出更详细的测试信息 (请求入参、image 请求出参、请求 URL、指定结果 jtl 文件格式为 xml),然后根据指定的 xsl 样式文件由 jtl 结果文件转换为 html 报告。

二、依赖环境

1.Jmeter+Jdk

本教程中使用的是 apache-jmeter-5.2.zip,亲们可以根据自行选择适合自己的版本安装并配置好环境变量,详细过程不再赘述,网上有很多教程。

2.Ant

本教程中使用的是 apache-ant-1.10.7-bin.tar.gz,亲们可以根据自行选择适合自己的版本安装并配置好环境变量,详细过程不再赘述,网上有很多教程。

3.Jenkins

本教程中使用的是公司统一部署的 Jenkins,故不再赘述安装过程。

三、各部分集成过程

1.Jmeter+Ant 集成

特别注意其中的 xsl 样式文件,jmeter 安装目录/extras 下有 jmeter 自带的两个.xsl 样式,ant 就是根据这个样式完成的从 jtl 文件到 html 文件的转换,可以使用 jmeter 自带的也可使用自定义的,网上使用比较多的就是 jmeter.results.shanhe.me.xsl,得到的测试结果更新更加的详细,推荐使用这个。没找到粘贴文件的地方,大家网上百度这个样式吧,很容易找到。

#设置jemter的jtl结果文件中打印以下内容,使测试结果更详细
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=false
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
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=false
jmeter.save.saveservice.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
#设置jmeter生成的jtl文件是xml格式的
jmeter.save.saveservice.output_format=xml

2.Jmeter+Ant+Jenkins 集成

创建一个风格自由的 job 任务,下面是 job 的配置步骤

四、踩坑记录

1.jenkins

1)脚本及目录中禁止出现中文字符,否则在 Jenkins 中访问会出错找不到
2)执行 Execute shell 中可能会出现 jmeter 命令 not found,各种命令 not found
解决方案:重新 export 一下环境变量

2.jemter

1)生成的 jtl 文件中 response data 显示:Non-TEXT response data, cannot record: ()
原因分析:通过查看 jmeter 源码发现:如果接口的返回 response header 中没有 content_type 字段,则会导致源码判断中条件不满足,触发此错误
接口没有返回 content_type:

接口返回 content_type:

Jmeter 源码

//包含在https://github.com/apache/jmeter/blob/master/src/core/src/main/java/org/apache/jmeter/save/converters/SampleResultConverter.java类中
public static final String TEXT = "text"; // $NON-NLS-1$
protected void saveResponseData(HierarchicalStreamWriter writer, MarshallingContext context, SampleResult res,
            SampleSaveConfiguration save) {
        if (save.saveResponseData(res)) {
            writer.startNode(TAG_RESPONSE_DATA);
            writer.addAttribute(ATT_CLASS, JAVA_LANG_STRING);
            try {
                if (SampleResult.TEXT.equals(res.getDataType())){
                    writer.setValue(new String(res.getResponseData(), res.getDataEncodingWithDefault()));
                } else {
                    writer.setValue("Non-TEXT response data, cannot record: (" + res.getDataType() + ")");
                }
                // Otherwise don't save anything - no point
            } catch (UnsupportedEncodingException e) {
                writer.setValue("Unsupported encoding in response data, cannot record: " + e);
            }
            writer.endNode();
        }
        if (save.saveFileName()){
            writer.startNode(TAG_RESPONSE_FILE);
            writer.addAttribute(ATT_CLASS, JAVA_LANG_STRING);
            writer.setValue(res.getResultFileName());
            writer.endNode();
        }
    }

解决方案
1)修改 jmeter 源码把 if 判断去掉
2)简单粗暴的方式:是把出错的 response data 通过 beanshell 的方式写入到一个专门的文件中,作为补救措施


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