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文档,到这里格式可能略有变化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值