2017年中旬,有幸接手了公司新产品的测试,领导通知说该项目需要进行功能测试、性能测试和接口测试,顿时压力倍增(于是我把压力(鸭梨)放在了冰箱里,就变成了动力(冻梨)),此前对性能测试一无所知,了解程度只能用"听过"来形容。
性能测试首选的工具是JMeter,在此不多做介绍,但是不得不说JMeter也是一款非常好的接口测试工具。性能测试过程中手工重复的活动非常多,为了给客户提供一个性能测试报告,我用了一周时间进行并发测试、数据整理、数据分析、最后生成测试报告,真的是手工重复到怀疑人生;于是萌生了实现性能测试自动化的想法。之前用Robot framework框架做过WEB自动化、安卓端自动化、接口自动化,但是始终未正真明白自动化的意义或是价值,现在突然顿悟,测试工作中最大的痛点就是重复,减少工作中的痛点才是自动化最大的价值。所以自动化的第一步不是选用什么语言或是框架,而是能真正分析出自己工作中的痛点。
实现性能测试自动化的过程中也参考了许多使用Jmeter生成测试报告的文章,但是都很零散,因此本文是借助前人的智慧再加上自己的创新和实战积累而成的。
本文有如下看点:
1、框架简介、用图形化的方式简介测试框架;
2、环境搭建、实战步骤,避免踩雷、入坑;
3、自动生成邮件报告,优化代码同时输出性能测试报告和接口详情报告;
4、遇到问题汇总,一站解决所有疑问;
5、代码共享,降低他人的学习成本;
JMeter+Ant是比较常见的自动化测试框架,因为JMeter、Ant都是由java开发的,所以此性能测试框架具有良好的跨平台性;下图是按自己的理解绘制的自动化框架图:
大体逻辑如下:
(1)Ant通过XML文件进行构建,所有的构建信息配置在build.xml文件中,通过调用target树来执行各种任务;如执行测试脚本(jmx文件),输出测试结果(jtl文件);
(2)Ant通过测试结果(jtl文件)构建生成html测试报告,输出在制定路径下;
(3)根据build.xml文件中配置的邮件信息,将html测试报告自动发送到制定的邮箱;
(1)设置路径:我的电脑->属性->高级->环境变量;
(2)在【系统变量】新增JAVA_HOME,变量为JDK的路径;
(3)PATH中添加 C:\Program Files\Java\jdk1.8.0_05\bin;
(1)cmd进入命令行,输入:java -version,显示出java 的版本信息即配置成功;
(1)设置路径:我的电脑->属性->高级->环境变量:
(2)在【系统变量】新增JMETER_HOME,变量为jmeter的路径
(3)PATH中添加 %JMETER_HOME%\bin;
(1)cmd进入命令行,输入:jmeter -v,显示出JMETER的版本信息即配置成功;
(1) 设置路径:我的电脑->属性->高级->环境变量:
(2)在【系统变量】新增ANT_HOME,变量为ANT的路径
(3)PATH中添加 D:\apache-ant-1.9.9\bin;
(1)cmd进入命令行输入:ant -version,显示出Ant的版本信息即配置成功;
(1)JMeter脚本按测试计划选中进行保存,如果按线程进行保存,构建时会报错,后面问题汇总模块会提到,例如保存为TestPlan.jmx。
(2)新增构建文件的文件夹,例如在D盘根目录下新增文件夹"JMeterTest",里面再新增以下文件夹
(3)修改配置文件:jmeter.properties
文件路径:%JMETER_HOME%\bin\jmeter.properties
将jmeter.save.saveservice.output_format=csv改为jmeter.save.saveservice.output_format=xml,去掉前面备注的#号。
Ant是用xml格式来进行构建的,默认文件名称为build。构建文件的默认地址为%JMETER_HOME%\extras\build.xml,但是为了构建方便,我们将xml文件放在我们自己目录下,并且根据自己的需要自定义构建内容。
(1)在新增目录D:\JMeterTest\XML下新增build.xml,ant来定义测试活动,具体的内容都在build.xml中进行配置。
(2)build.xml中构建活动定义完成后,cmd进入命令行,进入build.xml的目录下输入ant,回车执行,如下图提示BUILD SUCCESSFUL即可成功。
(3)本地目录下 D:\JMeterTest\HTML,可查看到测试报告;查收邮件,附件也收到了HTML测试报告,如下截图:
(4)本地目录下 D:\JMeterTest\JTL,可看的生成的测试结果文件,可用Jmeter聚合报告的预览进行查看,见截图:
截止目前,我们已经基本实现了接口测试自动化,如果要实现性能测试自动化,还要对生成测试报告模板的代码进行优化。
JMeter性能测试中,我们主要会关注聚合报告中Average time、Throughput、90% Line等指标,因此我们在测试报告中增加TPS(Throughput)和90% Line等指标,
(1)在build.xml的代码中可以看出测试报告调用的模板是 %JMETER_HOME%\extras 路径下的jmeter-results-detail-report_21文件,
(2)因此我们在jmeter-results-detail-report_21文件中进行修改,小编自己修改了很久,但是TPS得值总是不显示,最后参考了其他博客文章得以解决.
(3)由于该模板的代码非常多,优化后的模板代码可以在我的CSDN上进行下载;下载地址:http://download.csdn.net/download/okkczf/10233753
该报告的原始模板也可以在网上进行下载,下载地址:http://blog.csdn.net/luozhuwang/article/details/51889159 (感谢作者的分享)
(1)将该模板 jmeter.results.detail.me.xls 放在 %JMETER_HOME%\extras路径下;
(2)要想调用该模板输出测试报告需要在build.xml文件中增加以下代码,我用reportdetail定义该测试活动;
(3)cmd进入命令行,进入build.xml的目录下输入ant,回车执行后,邮件即可收到两个HTML附件,第一个附件为测试报告,第二个附件即为增加的接口测试详情;
接口测试详情如下截图:
以下是build.xml构建代码:
<?xml version="1.0" encoding="utf8"?> <project name="TestPlan" default="all" basedir="."> <tstamp> <format property="time" pattern="yyyyMMddhhmm" /> </tstamp> <!-- 需要改成自己本地的Jmeter目录--> <property name="jmeter.home" value="Jmeter目录" /> <!--jmeter生成jtl格式的结果报告的路径--> <property name="jmeter.result.jtl.dir" value="D:\JMeterTest\JTL" /> <!--jmeter生成html格式的结果报告的路径--> <property name="jmeter.result.html.dir" value="D:\JMeterTest\HTML" /> <!--生成的报告的前缀--> <property name="ReportName" value="TestReport" /> <property name="jmeter.result.jtlName" value="${jmeter.result.jtl.dir}/${ReportName} ${time}.jtl" /> <property name="jmeter.result.htmlName" value="${jmeter.result.html.dir} /${ReportName}${time}.html" /> <property name="jmeter.resultdetail.htmlName" value="${jmeter.result.html.dir} /Interface-detail.html" /> <target name="all"> <antcall target="test" /> <antcall target="report" /> <antcall target="reportdetail" /> <antcall target="sendmail" /> </target> <target name="test"> <taskdef name="jmeter" classname="org.programmerplanet.ant.taskdefs. jmeter.JMeterTask" /> <jmeter jmeterhome="${jmeter.home}" resultlog="${jmeter.result.jtlName}"> <!--声明要运行的脚本。"*.jmx"指包含此目录下的所有jmeter脚本--> <testplans dir="D:\JMeterTest\JMX" includes="*.jmx" /> <property name="jmeter.save.saveservice.output_format" value="xml"/> </jmeter> </target> <path id="xslt.classpath"> <fileset dir="${jmeter.home}/lib" includes="xalan*.jar"/> <fileset dir="${jmeter.home}/lib" includes="serializer*.jar"/> </path> <target name="report"> <xslt classpathref="xslt.classpath" force="true" in="${jmeter.result.jtlName}" out="${jmeter.result.htmlName}" style="${jmeter.home}/extras/jmeter-results-detail-report_21.xsl"> <param name="dateReport" expression="${time}"/> </xslt> <!-- 因为上面生成报告时,不会将相关的图片也一起拷贝至目标目录,需要手动拷贝 --> <copy todir="${jmeter.result.html.dir}"> <fileset dir="${jmeter.home}/extras"> <include name="collapse.png" /> <include name="expand.png" /> </fileset> </copy> </target> <target name="reportdetail"> <xslt in="${jmeter.result.jtlName}" out="${jmeter.resultdetail.htmlName}" style="${jmeter.home}/extras/jmeter.results.detail.me.xsl"/> </target> <!--发送邮件--> <target name="sendmail" > <mail mailhost="mail.star-net.cn" user="***@***.com" password="***" subject="接口测试报告" from="***@***.com"> <to address="***@***.com"/> <message>详细报告请查看附件,请用浏览器打开查看!</message> <attachments> <fileset dir="${jmeter.result.html.dir}"> <include name="${ReportName}${time}.html"/> </fileset> <fileset dir="${jmeter.result.html.dir}"> <include name="Interface-detail.html"/> </fileset> </attachments> </mail> </target> </project>
本文为JMeter+Ant实现性能测试自动化过程所有遇到的问题的整理汇总
(1)ant构建遇到问题:1字节的UTF-8序列的字节1无效;
解决方法:build.xml中UTF-8改为UTF8;
(2)ant构建遇到问题:运行ant 报错Could not find the TestPlan class!
解决办法: 运行的jmeter脚本 TestPlan.jmx要测试计划层做保存,而不是在threads层做保存。
(3)ant构建时遇到如下报错:
解决办法:下载mail-1.4.7.jar,放在 D:\apache-ant-1.9.9\lib 目录下
(4)生成报告存在的问题:
生成的报告中Min time 和Max time的时间显示为NaN,Date report: date not defined ,如下截图:
解决办法:
(1)将apache-jmeter-3.2\lib中的serializer-2.7.2.jar、xalan-2.7.2.jar复制到apache-ant-1.9.9\lib中即可解决问题(1);
(2)build.xml代码中增加以下内容
注意事项:变量${time}在代码中的定义 ,如果两处名称不一致则构建失败;
<tstamp> <format property="time" pattern="yyyyMMddhhmm" /> </tstamp>
截止目前,Jmeter+Ant的性能自动化框架已经搭建完成,如果需要你也可以使用Jenkins集成,本文中暂不介绍Jenkins的配置。文章依然存在很多的不足,沐沐会继续努力争取以后分享更多有价值的干货。古人云"The more we share, the more we have",将分享进行到底...
版权声明:本文出自51Testing会员投稿。51Testing软件测试网及相关内容提供者拥有内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像,否则将追究法律责任。