JMeter+Ant实现性能测试自动化
一、前言
2017年中旬,有幸接手了公司新产品的测试,领导通知说该项目需要进行功能测试、性能测试和接口测试,顿时压力倍增(于是我把压力(鸭梨)放在了冰箱里,就变成了动力(冻梨)),此前对性能测试一无所知,了解程度只能用“听过”来形容。
性能测试首选的工具是JMeter,在此不多做介绍,但是不得不说JMeter也是一款非常好的接口测试工具。性能测试过程中手工重复的活动非常多,为了给客户提供一个性能测试报告,我用了一周时间进行并发测试、数据整理、数据分析、最后生成测试报告,真的是手工重复到怀疑人生;于是萌生了实现性能测试自动化的想法。之前用Robot framework框架做过WEB自动化、安卓端自动化、接口自动化,但是始终未正真明白自动化的意义或是价值,现在突然顿悟,测试工作中最大的痛点就是重复,减少工作中的痛点才是自动化最大的价值。所以自动化的第一步不是选用什么语言或是框架,而是能真正分析出自己工作中的痛点。
二、性能测试范围
简言之,性能测试的目的就是分析性能瓶颈和调优,可是如何分析性能瓶颈?性能测试过程中应该关注那些指标?这些问题都是在我性能测试学习过程中比较迷茫的问题,于是按照自己的理解,整理了性能测试的主要范围,详见下图:
性能测试范围
实际项目过程中,我主要是做接口性能测试,因此主要关注的是系统指标和服务端资源占用率。
三、性能测试过程
性能测试可以过程可以简单的分为四个步骤,如下图:
性能测试流程性能测试的实际过程中遇到了两个难点:“明确性能指标”和“结果分析调优”;前者的难点在于没有人可以给我提供性能指标,性能良好的指标是什么?怎样的并发数、吞吐率或是响应时间符合性能预期标准?一切都是未知数,感觉自己在摸石头过河。后者的难点不言而喻,也是整个性能测试的难点。性能分析的目的在于分析出系统的性能瓶颈,性能调优的目的则是使系统可以具备高可用性、高可靠性和高并发性。
同样,在性能测试过程中也遇到了两个痛点:“运行测试脚本”和“生成测试报告”;前者主要是测试场景复杂,需要不断的重复运行脚本,后者是需要手工整理数据、分析测试结果然后生成测试报告。前文中有提及到“自动化最大的价值就是减少工作中的痛点”,经常重复运行脚本是否可以批量执行?测试报告是否可以自动生成?因此针对这两个痛点,如何实现自动化将在下文解析。
四、自动化框架介绍
JMeter+Ant是比较常见的自动化测试框架,由于JMeter、Ant都是由java开发的,所以此性能测试框架具有良好的跨平台性;下图是按自己的理解绘制的自动化框架图:
JMeter+Ant自动化测试框架大体逻辑如下:
(1)Ant通过XML文件进行构建,所有的构建信息配置在build.xml文件中,通过调用target树来执行各种任务;因此,性能测试过程中,可以按照不同的测试场景,设计测试脚本,然后通过Ant进行构建,实现批量执行。
(2)Ant通过测试结果(jtl文件)构建生成html测试报告,并且输出在指定路径下;这一步即可解决第二个痛点“手工整理性能测试报告”。
(3)根据build.xml文件中配置的邮件信息,将html测试报告自动发送到指定的邮箱;
五、环境搭建
Java安装
1、Java下载地址:https://www.java.com/zh_CN/
2、Java 环境变量配置
(1)设置路径:我的电脑—>属性—>高级—>环境变量;
(2)在【系统变量】新增JAVA_HOME,变量为JDK的路径;
(3)PATH中添加 C:\Program Files\Java\jdk1.8.0_05\bin;
3、检验是否配置成功
(1)cmd进入命令行,输入:java -version,显示出java 的版本信息即配置成功;
JMeter安装
1、JMeter下载地址:http://jmeter.apache.org/download_jmeter.cgi
2、JMeter 环境变量配置
(1)设置路径:我的电脑—>属性—>高级—>环境变量:
(2)在【系统变量】新增JMETER_HOME,变量为jmeter的路径
(3)PATH中添加%JMETER_HOME%\bin;
3、检验是否配置成功
(1)cmd进入命令行,输入:jmeter -v,显示出JMETER的版本信息即配置成功;
Ant安装
1、Ant下载地址:http://ant.apache.org/bindownload.cgi
2、Ant 环境变量配置
(1) 设置路径:我的电脑—>属性—>高级—>环境变量:
(2)在【系统变量】新增ANT_HOME,变量为ANT的路径
(3)PATH中添加 D:\apache-ant-1.9.9\bin;
3、检验是否配置成功
(1)cmd进入命令行输入:ant -version,显示出Ant的版本信息即配置成功;
六、构建步骤
1、测试准备
(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,去掉前面备注的#号。
2、Ant构建
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聚合报告的预览进行查看,见截图:
截止目前,我们已经基本实现了接口测试自动化,如果要实现性能测试自动化,还要对生成测试报告模板的代码进行优化。
七、报告优化
1、报告增加性能指标
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得值总是不显示,最后参考了以下博客文章得以解决,参考文章https://www.cnblogs.com/jaychang/p/5881525.html在此感谢作者无私的代码分享。
(3)由于该模板的代码非常多,优化后的模板代码可以在我的CSDN上进行下载;下载地址:http://download.csdn.net/download/okkczf/10233753
2、加接口详情的报告
该报告的原始模板也可以在网上进行下载,下载地址: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附件,第一个附件为测试报告,第二个附件即为增加的接口测试详情;
接口测试详情如下截图:
以上代码也可以在我的CSDN上下载:
http://download.csdn.net/download/okkczf/10220295
八、遇到问题
本文为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}在代码中的定义 ,如果两处名称不一致则构建失败;
截止目前,Jmeter+Ant的性能自动化框架已经搭建完成,如果需要你也可以使用Jenkins集成,本文中暂不介绍Jenkins的配置。文章依然存在很多的不足,沐沐会继续努力争取以后分享更多有价值的干货。古人云“The more we share, the more we have”,将分享进行到底...