Jmeter在性能测试中的应用实践样例
Jmeter在某项目中进行性能测试中的应用实践样例
前段时间再次做了一次实践,基于JMeter进行了一下性能测试。昨天简要整理了一下,写了一篇文档,现在分享于此。
编制 |
念槐聚 |
日期 |
2016-01-26 |
审核 |
|
日期 |
|
发布 |
|
日期 |
|
发布 |
|
日期 |
|
变更记录
*修订类型分为 A - ADDED M - MODIFIED D – DELETED
注:对该文件内容增加、删除或修改均需填写此记录,详细记载变更信息,以保证其可追溯性
目录
目录
1文档目的:
2 适用范围:
3 参考文献:
4 Dubbo接口测试代码编写
4.1 创建工程,并导入依赖包
4.2 Jmeter中的case结构(JavaSamplerClient)
4.3 生成class可执行文件
5 Jmeter中进行测试执行
5.1 新建测试计划
5.2配置线程组
5.3添加java请求
5.4添加定时器
5.6添加监控项:Transactions per Second
5.7添加监控项:Transaction Throughtput vs Threads
5.5添加聚合报告
5.8其他扩展:前置处理器
5.9其他扩展:断言
6. 测试执行
7. 备注
1文档目的:
本文档主要对Jmeter在练习测试项目过程中的一次应用实践,做一简单描述,对于通过Dubbo接口,经过消息中心的处理与MQ的分发,以及MySQL入库\下发至网关的整个流程所涉及的测试方法,做一些简要的说明。
2 适用范围:
本文档主要适用于做测试,对JMeter没有了解过的测试人员,熟悉或已经精通JMeter的人可以忽略。
3 参考文献:
Jmeter API:
http://jmeter.apache.org/api/
4 Dubbo接口测试代码编写
4.1 创建工程,并导入依赖包
依赖包,包含两部分:一部分是压测工具Jmeter所需要的依赖包,参见下面截图
另外一部分,是业务相关的依赖包:jmeter-haotest-server.jar;
将相关lib包放在jmeter的目录${Jmeter_home}\apache-jmeter-2.13\lib\ext 下面,然后将jar包导入到eclipse中。
配置文件:

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:util="http://www.springframework.org/schema/util" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <dubbo:application name="hello-world-consumer" /> <dubbo:registry address="zookeeper://192.168.221.31:2181" /> <!-- <dubbo:registry address="zookeeper://192.168.220.220:2181" /> --> <dubbo:reference id="MsgService" interface="com.haotest.jmeter.lesson1.JMeterSendMsgService" timeout="500000" /> </beans>
4.2 Jmeter中的case结构(JavaSamplerClient)
我们jmeter中的的一个完整case是要继承JavaSamplerClient这个类,继承这个类之后,在eclipse 中会自动生成需要重写的方法,这些方法就是我们这个文档主要介绍的部分。
如下代码示例:
实例中添加了这些方法的说明,接下来我会具体介绍每个方法如何完成代码开发。
TestInit.java:初始化基础类

package message.center;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.haotest.jmeter.lesson.SendMsgService;
public abstract class TestInit extends AbstractJavaSamplerClient {
public static ClassPathXmlApplicationContext msgServiceContext = new ClassPathXmlApplicationContext(new String[] { "msgCenterConsumer.xml" });
public static SendMsgService sendMsgService = (SendMsgService) msgServiceContext.getBean("MsgService");
@Override
public void setupTest(JavaSamplerContext context) {
// TODO Auto-generated method stub
System.out.println("calling setupTest when initing thread ...");
//setMsgServiceContext(new ClassPathXmlApplicationContext(new String[] { "msgCenterConsumer.xml" }));
//setSendMsgService((SendMsgService)this.getMsgServiceContext().getBean("MsgService"));
super.setupTest(context);
}
}
JMeterTestSendTemplateMsgByEmail.java:
Dubbo接口类

package message.center;
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.support.ClassPathXmlApplicationContext;
import com.haotest.jmeter.lesson.JMeterSendMsgResult;
import com.haotest.jmeter.lesson.JMeterSendMsgService;
public class JMeterTestSendTemplateMsgByWeChat extends TestInit {
/*@Override
public void setupTest(JavaSamplerContext context) {
// TODO Auto-generated method stub
setMsgServiceContext(new ClassPathXmlApplicationContext(new String[] { "msgCenterConsumer.xml" }));
setJMeterSendMsgService((JMeterSendMsgService)this.getMsgServiceContext().getBean("MsgService"));
super.setupTest(context);
}*/
public Arguments getDefaultParameters() {
Arguments params = new Arguments();
params.addArgument("template_var","");
params.addArgument("app_id", "");
params.addArgument("url", "");
params.addArgument("open_id", "");
//params.addArgument("email_title","");
return params;
}
@Override
public SampleResult runTest(JavaSamplerContext arg0) {
// TODO Auto-generated method stub
SampleResult sr = new SampleResult();
String templateVar = arg0.getParameter("template_var");
String appId = arg0.getParameter("app_id");
String url = arg0.getParameter("url");
String openId = arg0.getParameter("open_id");
//String emailTitle = arg0.getParameter("email_title","");
//ClassPathXmlApplicationContext msgServiceContext = new ClassPathXmlApplicationContext(new String[] { "msgCenterConsumer.xml" });
//msgServiceContext.start();
//JMeterSendMsgService JMeterSendMsgService = (JMeterSendMsgService) msgServiceContext.getBean("MsgService");
try {
sr.sampleStart();//start transaction in load runner
//System.out.println("beginning to call dubbo interface ...");
JMeterSendMsgResult smr = TestSendTemplateMsgByWeChat.JMeterSendMsgService.sendTemplateMsgByWeChat("JMETER_TEST_CODE",
appId,
templateVar,
url,
openId,
null,
null
);
if(smr.getCode() == 0) {
sr.setSuccessful(true);
} else {
sr.setSuccessful(false);
}
//System.out.println("response = " + smr.getMsg());
} catch(Exception e) {
e.printStackTrace();
System.out.println("calling dubbo interface failed ... " + e);
sr.setSuccessful(false);
} finally {
sr.sampleEnd();
}
return sr;
}
}
4.3 生成class可执行文件
代码调通之后,需要重新clean,并run生成编译后的可执行文件;
然后联通bin目录一起copy到Jmeter机器中,标机为 ${jmeter_workspace_home};
5 Jmeter中进行测试执行
相关脚本调试通过之后,可以在压测工具Jmeter中执行:
启动D:\apache-jmeter-2.13\bin\jmeter.bat
打开 ${jmeter_workspace_home}\scenarios\JMeterTestSendTemplateMsgByWeChat.jmx
运行,并监控过程的输入。
下面对前一个过程进行详细的说明:
5.1新建测试计划
通过“文件”-->“新建”,添加一项测试计划;
5.2配置线程组
如上图所示,在测试计划中,添加线程组;
5.3添加java请求
在线程组下添加Java请求,如上图所示。添加结果如下:
在添加后的主窗口中,选择要测得类,并添加相应的参数。
包括参数的名称、值;
添加之后,进行保存。
5.4添加定时器
根据需要,有些压测需要添加定时器,则在线程组中,添加-->定时器-->固定定时器;
结果如下:
根据需要,并进行配置固定定时器的线程延时;
添加结果:
5.6添加监控项:Transactions per Second
测试过程中,我们需要监控相关tps,以及事务处理的线程情况等;
那么可以在监控器中添加相应的项,用以在后续测试执行之后得到相关数据;
如上图所示,添加之后,在测试执行过程中,实时的tps情况,即可在上表中呈现出来;
5.7添加监控项:Transaction Throughtput vs Threads
Transaction throughtput vs threads的添加方法和tps相同;
监控结果同样,会在执行过程中实时展现出来;
样例如下图:
*********
5.8添加聚合报告
通过选择 线程组-->监听器-->聚合报告,添加聚合报告之后,可以在聚合报告中看到总体的结果情况;
聚合报告的样例如下:
Label |
# Samples |
Average |
Median |
90% Line |
95% Line |
99% Line |
Min |
Max |
Error % |
Throughput |
KB/sec |
TestSendTemplateMsgByWeChat |
9531 |
40 |
22 |
96 |
124 |
188 |
2 |
630 |
0.00% |
55.7 |
0 |
总体 |
9531 |
40 |
22 |
96 |
124 |
188 |
2 |
630 |
0.00% |
55.7 |
0 |
*
********
5.9其他扩展:前置处理器
对于某些场景的测试而言,可能需要准备预埋数据;
而添加前置处理器可以帮助解决这些问题;
5.10其他扩展:断言
断言,顾名思义,添加断言,可以在测试之后,通过断言,直接验证和标记case是否通过;
6.测试执行
执行过程中监控相关数据,并得到相关报告。
下面截取部分测试执行的结果样例;
上图是一个接口测试的TPS结果图片;
上图是一个接口测试的thread情况结果图片;
7.备注
JMeter的使用有更多的场景;
该文仅仅是一种基本的使用示例,欲了解更多,后续再逐渐补充;
补充服务启动的一个shell

[haotest@vm-qa-192_168_1_100 haoTestCenter]$ cat message-server/run.sh #!/bin/sh #libPath="/data/app/online/haotest-server/lib" #configPath="/data/app_resource/online/haotest-server" #logpath='/data/logs/haotest-server' #websitePath="." #CLASSPATH=`find $libPath -name *.jar|xargs|sed "s/ /:/g"` #CLASSPATH="$configPath:.:$CLASSPATH" #export CLASSPATH #echo $CLASSPATH pkill -9 -f haotest-lesson-server #sleep 1 source ~/.bash_profile7 #nohup java main.StartOnline > haotest-server.out & java -Xms4072m -Xmx4072m -XX:MaxPermSize=512m -Xss256k \ -Djava.rmi.server.hostname=192.168.1.100 \ -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=6093 \ -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false \ -jar haotest-lesson-server.jar >> ./log/haoTestCenter.out & #sleep 10 #tailf $logpath/haotest-server.out tailf ./log/haoTestCenter.out
由于是先编写了word文档,到这里格式可能略有变化。
转载请注明出处:http://cnblogs.com/haochuang/,谢谢。

赠人玫瑰
手留余香
我们曾如此渴望命运的波澜,到最后才发现:人生最曼妙的风景,竟是内心的淡定与从容……我们曾如此期盼外界的认可,到最后才知道:世界是自己的,与他人毫无关系!-杨绛先生
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?