目录
目录 2
- 简介... 4
- JMeter与LoadRunner区别... 4
- 环境配置... 5
3.1 安装JDK. 5
3.2 配置JDK环境变量... 9
3.3 安装并配置Maven. 13
3.4 下载JMeter 15
- JMeter分类使用... 16
4.1 对于Dubbo类接口的测试.. 16
4.1.1 安装开发工具IDEA. 16
4.1.2 配置字符集格式... 16
4.1.3 使用IDEA导入Maven工程.. 18
4.1.4 配置pom.xml导入项目依赖包... 26
4.1.5 pom.xml中加入被测API 27
4.1.6 点击刷新Maven项目... 28
4.1.7 配置zookeeper地址及调用接口... 28
4.1.8 新建包名以及测试类型.. 29
4.1.9 代码示例(统一账务查询接口).. 31
4.1.10 对项目进行打包.. 35
4.1.11 对依赖包进行输出lib目录.. 36
4.1.12进入项目路径检查各个包... 39
4.1.13解压JMeter 40
4.1.14 拷贝target中jar包至JMeter \lib\ext 41
4.1.15 拷贝lib中jar包至JMeter \lib. 42
4.1.16 开启JMeter界面... 43
4.1.17 进行冒烟测试或联通性测试... 47
4.1.18 指标参数说明... 47
4.2 对于WebService类接口的测试.. 48
4.2.1 开启一个干净版JMeter 48
4.2.2 新建线程组... 49
4.2.3 新建soap/xml请求.. 49
4.2.4 贴入xml报文及URL地址... 50
4.2.5 新增断言.. 50
4.2.6 新建聚合报告.. 51
4.2.7 新建查询结果树... 51
4.2.8 运行进行冒烟或联通测试... 52
4.3 监控工具NMON的使用... 53
4.3.1 NMON简介... 53
4.3.2 NMON安装... 53
4.3.3 NMON 运行.. 54
4.4 商用监控工具dytrace的配置及使用... 55
4.4.1 打开已安装完毕dytrace客户端... 55
4.4.2 创建系统配置文件.. 57
4.4.3 右击新增的配置名称,添加层... 58
4.4.4 远程进入应用服务器,配置Agent 62
4.4.5 进入任意目录上传Agent 的jar包... 62
4.4.6 运行jar包.. 63
4.4.7 进入生成路径.. 65
4.4.8 替换剪切板中的配置信息... 65
4.4.9 修改应用配置文件.. 67
4.4.10 保存并重启应用.. 67
4.4.11 回到监控端验证链接是否正确.. 68
4.5 多台压力机并发实现.. 71
4.4.1 测试项目拷贝至跳板机上... 71
4.4.2 同样的项目拷贝至另外一台网络相同的压力机上... 72
4.4.3 修改JMeter中配置文件.. 72
4.4.4 同理修改另一台压力机上的JMeter中配置文件.. 73
4.4.5 分别启动两台机器中的server.bat 73
4.4.5 打开JMeter界面,测试可以同时压力并发.. 74
1. 简介
Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域。 它可以用于测试静态和动态资源,例如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库、FTP 服务器, 等等。JMeter 可以用于对服务器、网络或对象模拟巨大的负载,来自不同压力类别下测试它们的强度和分析整体性能。另外,JMeter能够对应用程序做功能/回归测试,通过创建带有断言的脚本来验证你的程序返回了你期望的结果。为了最大限度的灵活性,JMeter允许使用正则表达式创建断言。
Apache jmeter 可以用于对静态的和动态的资源(文件,Servlet,Perl脚本,java 对象,数据库和查询,FTP服务器等等)的性能进行测试。它可以用于对服务器、网络或对象模拟繁重的负载来测试它们的强度或分析不同压力类型下的整体性能。你可以使用它做性能的图形分析或在大并发负载测试你的服务器/脚本/对象。
2. JMeter与LoadRunner区别
JMeter与LoadRunner都是非常优秀的性能测试软件,区别内容如下表格。
对比项 | JMeter | LoadRunner |
安装 | 简单,解压即可 | 复杂,LoadRunner安装包大于1GB,安装时间较长 |
录制/回放 | 支持 | 支持 |
测试协议 | 偏少,用户可自行扩展 | 较多,用户不可自行扩展 |
分布式大规模压力 | 支持 | 支持 |
IP欺骗功能 | 不支持 | 支持 |
图形报表 | 支持(较弱) | 支持(很强) |
测试逻辑控制 | 支持 | 支持 |
监控服务资源(CPU、内存) | 支持 | 支持 |
功能测试 | 支持 | 不支持 |
测试成本 | 免费开源 | 商业收费(费用很高) |
3. 环境配置
3.1 安装JDK
进入Oracle官网下载
Java Downloads | Oracle
注意:JMeter支持1.4或更高JDK版本。
用鼠标左键双击JDK安装包,会出现下图所示的安装界面。
其实上面那个步骤是在加载配置,为安装JDK做前期准备。之后会出现下图所示的界面。
- 我们选中“我接受该许可证协议中的条款”,“下一步”按钮将自动激活,然后点击该按钮,会出现下图所示的自定义安装界面。
- 可以根据需要选择不同的安装路径和安装内容。这里我们保持默认选择。点击“下一步”出现下图所示的“正在安装”界面。
- 等待进度条到100%的时候,又会跳出“自定义安装”界面,这个时候要安装的是语言支持插件。直接点击下一步。
- 然后会出现浏览器关联选项,可以根据自己的需要选择,安装完毕后还可以在控制面板中更改该选项。
- 点击“下一步”会出现安装完成的提示。当然这步要注意一下,360安全卫士可能会提示木马防火墙,大家要选择“允许程序的所有操作”,否则可能会造成JDK安装不完整。
1、完成了第一步,只是把JDK环境安装完成了。这个时候还要通过一系列的环境变量的配置才能使用JDK环境进行JAVA开发。配置环境变量包括java_home,path和classpath三个部分。
2、用鼠标右击“我的电脑”,选择“属性”->“高级”->“环境变量”->“系统变量”->“新建”。
- 在“变量名”输入框中写入“java_home”,在“变量值”输入框中写入“C:\Program Files\Java\jdk1.6.0” (根据安装路径填写),然后点击“确定”,java_home就设置完成了。
- 下面开始“classpath”的配置。选中“系统变量”查看是否有classpath项目,如果没有就点击“新建”,如果已经存在就选中classpath选项,点击“编辑”按钮,然后在“变量名”中填写“classpath”,在“变量值”中填写“C:\Program Files\Java\jdk1.6.0\jre\lib”(根据安装路径填写)。
- 现在可以进行“path”的配置了。同上在“classpath”设定时类似,“变量名”输入框填写“path”,“变量值”输入框填写“C:\Program Files\Java\jdk1.6.0\bin”(根据安装路径填写)。
- JDK的环境变量已经配置完成,可以通过打开命令提示符窗口,输入命令“java -version”, 看到Java版本的信息,来确定安装是否成功。首先点击“开始”,然后点击“运行”。
- 然后会出现下图所示的输入界面,输入“cmd”,按"Enter"键。
- 这个时候就进入了“命令提示符”窗口。这个时候输入“java -version”,特别注意 java和-version之间有一个空格,按"Enter"键。
- JDK版本信息就全部显示出来了,也表面JDK已经安装和配置完成,可以开始进行JAVA开发了。
首先,先到官网去下载maven。这里是官网的地址:http://maven.apache.org/download.cgi 请选择最新的版本下载,这里咱们下载的是apache-maven-3.1.1-bin.zip,在如图所示的红色部分
解压apache-maven-3.1.1-bin.zip,并把解压后的文件夹下的apache-maven-3.1.1文件夹移动到D:\Java下,如果没有Java这个文件夹的话,请自行创建。
右键“计算机”,选择“属性”,之后点击“高级系统设置”,点击“环境变量”,来设置环境变量,有以下系统变量需要配置:
新建系统变量 MAVEN_HOME 变量值:D:\Java\apache-maven-3.1.1
编辑系统变量 Path 添加变量值: ;%MAVEN_HOME%\bin
最后检验配置是否成功:用win键+R,来打开命令行提示符窗口,即Dos界面,输入mvn --version 若出现以下情况说明配置成功
注意事项
如果配置错误,请确保你已正确配置JDK环境变量
JDK环境变量配置参考经验:http://jingyan.baidu.com/article/ca41422fe3b7261eae99edc6.html
3.4 下载JMeter
下载地址:Apache JMeter - Apache JMeter™
下载后解压即可使用。
4. JMeter分类使用
4.1 对于Dubbo类接口的测试
4.1.1 安装开发工具IDEA
安装比较简单,一直点下一步即可
4.1.2 配置字符集格式
【右击属性】进入安装路径
打开配置文件
最后添加-Dfile.encoding=UTF8
4.1.3 使用IDEA导入Maven工程
4.1.4 配置pom.xml导入项目依赖包
4.1.5 pom.xml中加入被测API
4.1.6 点击刷新Maven项目
4.1.7 配置zookeeper地址及调用接口
4.1.8 新建包名以及测试类型
4.1.9 继承AbstractJavaSamplerClient类或实现JavaSamplerClient接口
方法介绍
@Override
public void setupTest(JavaSamplerContext javaSamplerContext) {
}
主要用于并发测试前的一下准备操作,一般做一些接口参数常量初始化
@Override
public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
return null;
}
主要为多线程并发方法体,一般用于调用接口请求,计算响应时间及断言结果
@Override
public void teardownTest(JavaSamplerContext javaSamplerContext) {
}
主要用于并发结束后的一些操作
@Override
public Arguments getDefaultParameters() {
return null;
}
主要用于JMeter UI界面展示参数项
4.1.9 代码示例(统一账务查询接口)
import com.bestpay.account.service.facade.BalanceQueryFacade;import com.bestpay.account.service.facade.model.BalanceDTO;import com.bestpay.account.service.facade.model.BalanceParamDTO;import com.bestpay.dubbo.result.Result;import org.apache.jmeter.config.Arguments;import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;import org.apache.jmeter.samplers.SampleResult;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext; import java.util.UUID; /** * 压测脚本 * Created by qinjie on 2016/1/27. * 账务余额查询接口 * 场景比例 */public class JTestBalanceQueryFacade extends AbstractJavaSamplerClient{ //加载 BalanceQueryFacade private ApplicationContext context = new ClassPathXmlApplicationContext( "classpath:applicationContext.xml"); private BalanceQueryFacade balanceQueryFacade = (BalanceQueryFacade)context.getBean(BalanceQueryFacade.class); //创建余额查询参数对象 private BalanceParamDTO balanceParamDTO; //创建接口返回对象 private Result result; /** * 重写Jmeter中getDefaultParameters方法为获取Jmeter中默认参数 * @return Arguments默认参数列表 */ public Arguments getDefaultParameters(){ //创建默认参数取值对象 Arguments arguments = new Arguments(); //账户类型 arguments.addArgument("accountType",""); //资金账户号 arguments.addArgument("accountNo",""); //账户名称(可以为空) arguments.addArgument("accountName",""); //客户账户号 arguments.addArgument("contractNo",""); //币种(可以为空) arguments.addArgument("ccy",""); //核算机构(可以为空) arguments.addArgument("settleBranch",""); //账户属性(可以为空) arguments.addArgument("accAttribute",""); //账户性质(可以为空) arguments.addArgument("accNature",""); //余额方向(可以为空) arguments.addArgument("drCrFlag",""); //状态(可以为空) arguments.addArgument("status",""); //区域码(可以为空) arguments.addArgument("areaCode",""); //会计日(可以为空) arguments.addArgument("accDate",""); return arguments; } /** * 初始化压测准备 * @param arg0 默认参数 */ public void setupTest(JavaSamplerContext arg0){ } /** * 执行压测完毕后 * @param arg0 默认参数 */ public void teardownTest(JavaSamplerContext arg0){ } /** * 执行压力测试代码 * @param javaSamplerContext 默认参数对象 * @return 响应时间等 */ @Override public SampleResult runTest(JavaSamplerContext javaSamplerContext) { //实例化参数对象 balanceParamDTO = new BalanceParamDTO(); balanceParamDTO.setAccountType(javaSamplerContext.getParameter("accountType")); balanceParamDTO.setAccountNo(javaSamplerContext.getParameter("accountNo")); balanceParamDTO.setAccountName(javaSamplerContext.getParameter("accountName")); balanceParamDTO.setContractNo(javaSamplerContext.getParameter("contractNo")); balanceParamDTO.setCcy(javaSamplerContext.getParameter("ccy")); balanceParamDTO.setSettleBranch(javaSamplerContext.getParameter("settleBranch")); balanceParamDTO.setAccAttribute(javaSamplerContext.getParameter("accAttribute")); balanceParamDTO.setAccNature(javaSamplerContext.getParameter("accNature")); balanceParamDTO.setDrCrFlag(javaSamplerContext.getParameter("drCrFlag")); balanceParamDTO.setStatus(javaSamplerContext.getParameter("status")); balanceParamDTO.setAreaCode(javaSamplerContext.getParameter("areaCode")); balanceParamDTO.setAccDate(null); //创建返回对象 SampleResult sampleResult = new SampleResult(); //创建日志ID号 String tranceLogID = UUID.randomUUID().toString(); //记录调用起始时间点 sampleResult.sampleStart(); result = balanceQueryFacade.queryBalance(balanceParamDTO,tranceLogID); //记录接口返回时间点 sampleResult.sampleEnd(); //返回结果传递SampleResult sampleResult.setSuccessful(result.isSuccess()); sampleResult.setResponseMessage(result.toString()); return sampleResult; } /** * 接口联通性测试 * @param args 默认参数 */ public static void main(String[]args){ JTestBalanceQueryFacade jTestBalanceQueryFacade = new JTestBalanceQueryFacade(); JavaSamplerContext arg = new JavaSamplerContext(jTestBalanceQueryFacade.getDefaultParameters()); jTestBalanceQueryFacade.runTest(arg); jTestBalanceQueryFacade.teardownTest(arg); }}可以通过Main方法进行接口调用测试
4.1.10 对项目进行打包
先clean 然后进行package
4.1.11 对依赖包进行输出lib目录
开始种,运行CMD
切换至工程路径
运行mvn dependency:copy-dependencies -DoutputDirectory=lib
4.1.12进入项目路径检查各个包
4.1.13解压JMeter
4.1.14 拷贝target中jar包至JMeter \lib\ext
4.1.15 拷贝lib中jar包至JMeter \lib
4.1.16 开启JMeter界面
如果zk地址为综测地址,建议放入综测进行打开
右键创建线程组
显示自己的测试类
4.1.17 进行冒烟测试或联通性测试
4.1.18 指标参数说明
Samples:请求次数
Average:平均响应时间
Median:中间值
90%Line:90%响应时间
Min:最小响应时间
Max:最大响应时间
Error%:错误率
Throughput: TPS 每秒或每分钟处理交易笔数
至此Dubbo类接口测试联通成功
4.2 对于WebService类接口的测试
4.2.1 开启一个干净版JMeter
4.2.2 新建线程组
4.2.3 新建soap/xml请求
4.2.4 贴入xml报文及URL地址
4.2.5 新增断言
4.2.6 新建聚合报告
4.2.7 新建查询结果树
4.2.8 运行进行冒烟或联通测试
联通成功
4.3 监控工具NMON的使用
4.3.1 NMON简介
nmon 工具可以帮助在一个屏幕上显示所有重要的性能优化信息,并动态地对其进行更新。这个高效的工具可以工作于任何哑屏幕、telnet 会话、甚至拨号线路。另外,它并不会消耗大量的 CPU 周期,通常低于百分之二。在更新的计算机上,其CPU使用率将低于百分之一。
4.3.2 NMON安装
上传nmon工具
4.3.3 NMON 运行
键盘输入cmd 即监控cpu memory disks
4.4 商用监控工具dytrace的配置及使用
4.4.1 打开已安装完毕dytrace客户端
远程进入172.17.162.73 用户admin/password
4.4.2 创建系统配置文件
4.4.3 右击新增的配置名称,添加层
选择【应用程序】=》Java,命名英文的层,点【下一步】
根据实际情况,选择监控应用系统版本及JVM版本,并下一步
非初次安装直接点【下一步】
复制剪切板内容至txt文本
点击【下一步】
4.4.4 远程进入应用服务器,配置Agent
4.4.5 进入任意目录上传Agent 的jar包
4.4.6 运行jar包
执行java -jar dynatrace-agent-6.2.0.1238-unix.jar
4.4.7 进入生成路径
4.4.8 替换剪切板中的配置信息
4.4.9 修改应用配置文件
加入配置信息
4.4.10 保存并重启应用
日志显示监控成功
4.4.11 回到监控端验证链接是否正确
说明监控ok,双击配置名称
选择传感器,及浏览
点击刷新按钮
勾选监控的类并确定
选择【活动的并启动 PurePath】并确定
选择【Agent概述】
右击选择部署
至此dytrace部署完毕
4.5 多台压力机并发实现
4.4.1 测试项目拷贝至跳板机上
4.4.2 同样的项目拷贝至另外一台网络相同的压力机上
4.4.3 修改JMeter中配置文件
进入bin目录修改jmeter.properties中remote_hosts,添加压力机的ip,其中localhost为本地机器也是压力机
4.4.4 同理修改另一台压力机上的JMeter中配置文件
4.4.5 分别启动两台机器中的server.bat
4.4.5 打开JMeter界面,测试可以同时压力并发
设置1秒内,启动1个线程,循环1次
由于两台机器,所以都是2倍。即,1秒内启动2线程,各循环1次。
5、Troubleshoot
5.1、JMETE进程数不进行递增。