最近在鼓捣Jmeter的接口测试,把他集成到了Jenkins上做自动化接口监听。把操作记录下来。
- 首先就是进行接口测试的编写。打开Jmeter。主要是把接口的测试逻辑和断言处理调通后就OK了,接口程序的IP和端口做成参数化。随时可以根据测试环境和开发环境以及生产环境间进行切换。请求参数里根据测试用例来设置接口所需的参数值
接口的后置BeanShell Assertion断言处理器
1 import java.util.regex.*; 2 3 //断言列表 4 String[] assertList =new String[]{(""list""+":\[(\{.*?\})+?\]"),""ID":"pl_findGroup"",""action":"post"",""teacherId":"tea_951_20368"",""serviceId":"pl_findGroup"",""status":"1""}; 5 // 要验证的字符串 6 String response = prev.getResponseDataAsString(); 7 // 编译正则表达式 8 Pattern pattern = Pattern.compile(assertList[0]); 9 // 忽略大小写的写法 10 // Pattern pat = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE); 11 Matcher matcher = pattern.matcher(response); 12 // 查找字符串中是否有匹配正则表达式的字符/字符串 13 boolean rs = matcher.find(); 14 if(!rs){ 15 FailureMessage = "断言失败:"+assertList[0]; 16 Failure = true; 17 prev.setResponseCode("500"); 18 log.info("Fail======================================"); 19 }else{ 20 //循环断言 21 for(int i =1;i<assertList.length;i++){ 22 if(!response.contains(assertList[i])){ 23 FailureMessage = "断言失败:"+assertList[i]; 24 Failure = true; 25 prev.setResponseCode("500"); 26 log.info("Fail======================================"); 27 return; 28 } 29 } 30 }
这边断言使用的是后置处理器的bean shell,当然断言也可以连接数据库进行数据diff,如果有必要的话。
- 最终接口调试完成后Jmeter会生成一个.jmx的测试脚本。下一步就是通过Ant的build.xml文件来调用Jmeter测试脚本和生成测试报告。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project name="JmeterTest" default="all" basedir="."> 3 <tstamp> 4 <format property="time" pattern="yyyy/MM/dd HH:mm" /> 5 </tstamp> 6 7 <!--Jmeter主目录--> 8 <property name="jmeter.home" value="D:/ProgramFiles/apache-jmeter-3.1" /> 9 10 11 <!--存放Jmeter生成的报告文件的文件夹--> 12 <property name="jmeter.result.dir" value="D:/ProgramFiles/jenkinsworkspace/workspace/Jmeter/results" /> 13 14 <!--Jmeter文件名--> 15 <property name="ReportName" value="TestReport" /> 16 17 <!--jtl文件--> 18 <property name="jmeter.result.jtlName" value="${jmeter.result.dir}/${ReportName}.jtl" /> 19 <!--html报告文件--> 20 <property name="jmeter.result.htmlName" value="${jmeter.result.dir}/${ReportName}.html" /> 21 22 23 <!--汇总标签--> 24 <target name="all"> 25 <antcall target="clean" /> 26 <antcall target="test" /> 27 <antcall target="report" /> 28 </target> 29 30 <!--每次清除Jmeter生成的结果目录--> 31 <target name="clean"> 32 <delete includeemptydirs="true"> 33 <fileset dir="${jmeter.result.dir}" includes="**/*"/> 34 </delete> 35 </target> 36 37 38 <!--运行Jmeter脚本文件--> 39 <target name="test"> 40 <taskdef name="jmeter" classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask" /> 41 <jmeter jmeterhome="${jmeter.home}" resultlog="${jmeter.result.jtlName}"> 42 <testplans dir="D:/jmeter/script" includes="*.jmx" /> 43 <property name="jmeter.save.saveservice.output_format" value="xml"/> 44 </jmeter> 45 </target> 46 47 <path id="xslt.classpath"> 48 <fileset dir="${jmeter.home}/lib" includes="xalan*.jar"/> 49 <fileset dir="${jmeter.home}/lib" includes="serializer*.jar"/> 50 </path> 51 52 <!--生成测试报告--> 53 <target name="report"> 54 <xslt classpathref="xslt.classpath" force="true" in="${jmeter.result.jtlName}" out="${jmeter.result.htmlName}" style="${jmeter.home}/extras/jmeter-results-detail-report_21.xsl" > 55 <param name="dateReport" expression="${time}"/> 56 </xslt> 57 <!--复制报告所需图标--> 58 <copy todir="${jmeter.result.dir}"> 59 <fileset dir="${jmeter.home}/extras"> 60 <include name="collapse.png" /> 61 <include name="expand.png" /> 62 </fileset> 63 </copy> 64 </target> 65 66 </project>
- 代码中是每次执行为build.xml后生成的测试报告html文件里会出现重复的数据。所以要在生成报告之前清楚一下以前的文件
- 把上面的build.xml文件放到某个文件夹下后,就可以开始配置Jenkins了。在Jenkins新建一个自由风格的项目,设置保存构建次数最大个数,因为是接口巡检,比较频繁,这样可以减少磁盘压力。
- 设置构建触发器,这里没30分钟自动构建一次
- 构建步骤,使用Ant进行构建。使用Ant的前提必须先下载ant后解压至磁盘,添加环境变量,在Jenkins的系统设置里设置Ant等步骤略过。
- 点击后设置运行build.xml文件的路径
- 下一步构建后操作添加Publish HTML reports插件,该插件用来展示Jmeter生成的测试报告结果的html文件
- 设置Publish HTML reports的html文件展示路径以及文件名称等设置
- 项目构建后,我们想要如果测试接口有错误的话(不管是断言逻辑错误还是服务器错误因素),就让他自动发送预警邮件,邮件里包含了所有的接口测试详情,错误信息。这个时候就用到了Editable Email Notification邮件扩展插件。但是现在有这样一种情况,在项目构建的过程中,不管jmx脚本文件中的接口是逻辑错误或者是服务器等其他因素造成的接口报错,邮件插件是根据Jenkins的构建错误后,才会发送定义好的报告。而Jmeter的脚本里的接口不管如何的报错,是都不会引起Jenkins构建错误的。也就是说项目构建除了特殊因素之外会一直构建成功,那么也就达不到我们想要的只在接口巡检发生错误的情况下才发送预警邮件的需求。
- 这个时候我们就要借助一些外在的因素,人为的让Jenkins在构建项目后,出现构建失败的情况。
- 重新建立一个新的自由风格的项目,该项目的构建触发器选择为依赖其他项目构建完成后才开始构建
- 下一步设置构建方式,选择用windows命令进行构建。
- 逻辑就是在Jmeter项目构建后,会在某个目录下生成TestReport.html报告。我们通过windows命令findstr搜索html报告里面的特殊关键字,比如报告里面就有100.00%的成功率关键字,如果没有出现这个关键字,就证明被测接口有错误的,我们就让该项目构建失败。如果找到了,就略过。
- 配置完命令后,在添加Editable Email Notification邮件扩展插件,来进行自定义邮件内容格式设置
- 在设置该插件之前必须先把Jenkins的系统设置里的基础邮件配置完成。下图扩展邮件设置。设置邮件内容类型Content Type为HTML格式的。在Default Content里面,可以把测试报告嵌入到邮件里。
- 完成之后回到Jenkins首页,点击Jmeter项目的构建,构建成功后,会自动再次构建依赖项目,该项目构建会根据缩写doc命令来查找生成的测试报告里有没有发送邮件的关键字。
- 如果报告里的接口出现错误的话,最终会根据邮件扩展插件的配置发送预警邮件
至于邮件里的html文件内容中文乱码问题,现在还没有找到好的解决办法。。。。