jmeter 测试dubbo接口

1、Jmeter简介

Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域。 它可以用于测试静态和动态资源,例如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库、FTP 服务器, 等等。JMeter 可以用于对服务器、网络或对象模拟巨大的负载,来自不同压力类别下测试它们的强度和分析整体性能。另外,JMeter能够对应用程序做功能/回归测试,通过创建带有断言的脚本来验证你的程序返回了你期望的结果。为了最大限度的灵活性,JMeter允许使用正则表达式创建断言。

Apache jmeter 可以用于对静态的和动态的资源(文件,Servlet,Perl脚本,java 对象,数据库和查询,FTP服务器等等)的性能进行测试。它可以用于对服务器、网络或对象模拟繁重的负载来测试它们的强度或分析不同压力类型下的整体性能。你可以使用它做性能的图形分析或在大并发负载测试你的服务器/脚本/对象。

2、我们为什么使用Jmeter

开源免费,基于Java编写,可集成到其他系统可拓展各个功能插件
支持接口测试,压力测试等多种功能,支持录制回放,入门简单
相较于自己编写框架活其他开源工具,有较为完善的UI界面,便于接口调试
多平台支持,可在Linux,Windows,Mac上运行

3.1、创建项目

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.memedai</groupId>
    <artifactId>me-jmeter-test</artifactId>
    <version>1.0-SNAPSHOT</version>

    <packaging>jar</packaging>


    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>


    <dependencies>
        <!-- jmeter  必须1-->
        <!--  <dependency>
              <groupId>org.apache.jmeter</groupId>
              <artifactId>ApacheJMeter_core</artifactId>
              <version>2.1.3</version>
          </dependency>-->
        <dependency>
            <groupId>org.apache.jmeter</groupId>
            <artifactId>ApacheJMeter_java</artifactId>
            <version>3.3</version>
        </dependency>

        <dependency>
            <groupId>cn.memedai</groupId>
            <artifactId>me-notification-sms-facade</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>cn.memedai.framework</groupId>
            <artifactId>me-fm-dubbo-ext</artifactId>
            <version>2.0-SNAPSHOT</version>
            <exclusions>
                <exclusion>
                    <groupId>com.alibaba</groupId>
                    <artifactId>fastjson</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.12</version>
        </dependency>

        <!-- spring  必须4-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.2.2.RELEASE</version>
        </dependency>


        <!-- dubbo 必须5-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.6.1mm</version>
            <exclusions>
                <exclusion>
                    <artifactId>spring</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
            <exclusions>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
                <!-- https://issues.apache.org/jira/browse/ZOOKEEPER-1371 zookeeper Remove
                    dependency on log4j in the source code. slf4j-log4j12会与log4j-over-slf4j循环依赖导致冲突 -->
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>1.4</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <filters>
                                <filter>
                                    <artifact>*:*</artifact>
                                    <excludes>
                                        <exclude>META-INF/*.SF</exclude>
                                        <exclude>META-INF/*.DSA</exclude>
                                        <exclude>META-INF/*.RSA</exclude>
                                    </excludes>
                                </filter>
                            </filters>

                            <transformers>
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                    <resource>META-INF/spring.handlers</resource>
                                </transformer>
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>com.fxc.rpc.impl.member.MemberProvider</mainClass>
                                </transformer>
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                    <resource>META-INF/spring.schemas</resource>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>


</project>

注意:dubbo和facade请根据自己公司使用的进行更换 不然肯定会报错的

package cn.memedai.util;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author hongwang.zhang
 * @version: 1.0
 * @date 2018/7/59:39
 * @see
 **/
public class DubboInit {

     private static DubboInit init = null;
     private DubboInit(){}
     private  static ApplicationContext context;
     public synchronized static DubboInit getInstance(){
          if(init == null){
               init = new DubboInit();
          }
          return init;
     }

     public   DubboInit  initApplicationContext(){
          context = new ClassPathXmlApplicationContext("classpath:/applicationContext-dubbo.xml");
          if(context==null)
          {
               throw new IllegalArgumentException("Load dubbo-client.xml fail");
          }
          return this;
     }

     public  Object getBean(String beanName) {
          return context.getBean(beanName);
     }
     public  Object getBean(Class beanName) {
          return context.getBean(beanName);
     }



}

JMeter java Sampler介绍

返回类型 方法
SampleResult getDefaultParameters() 用于获取界面的参数
SampleResult runTest(JavaSamplerContext context) 类似于LR的Action,result.sampleStart()一个事务开始,result.sampleEnd()一个事务 结束
void setupTest(JavaSamplerContext context) 初始化方法,类似于LR的init和Junit中的setUp()
void teardownTest(JavaSamplerContext context) 类似于LR的end和Junit中的tearDown()
package cn.memedai.jmeter.notiectionsms.notionficationsms;

import cn.memedai.menotification.facade.sms.business.MeSmsBusiness;
import cn.memedai.util.DubboInit;
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 java.util.Map;

/**
 * @author hongwang.zhang
 * @version: 1.0
 * @date 2018/7/510:10
 * @see
 **/
public class MeSmsBusinessJmeter extends AbstractJavaSamplerClient {


     MeSmsBusiness meSmsBusiness;

     private long start = 0;//记录测试开始时间;
     private long end = 0;//记录测试结束时间;

     private String phoneNo;
     private String ext;

     /**
      * 初始化操作
      *
      * @param context
      */
     @Override
     public void setupTest(JavaSamplerContext context) {

          DubboInit instance = DubboInit.getInstance().initApplicationContext();
          meSmsBusiness = (MeSmsBusiness) instance.getBean("meSmsBusiness");
     }

     // 这个方法是用来自定义java方法入参的。
     // params.addArgument("num1","");表示入参名字叫num1,默认值为空。
     // 设置可用参数及的默认值;
     @Override
     public Arguments getDefaultParameters() {
          Arguments params = new Arguments();
          params.addArgument("phoneNo", phoneNo);//未设默认值
          params.addArgument("ext", ext);
          return params;
     }

     public SampleResult runTest(JavaSamplerContext agr0) {
          start = System.currentTimeMillis();


          SampleResult result = new SampleResult();

          phoneNo = agr0.getParameter("phoneNo");
          ext = agr0.getParameter("ext");
          Map<String, Object> stringObjectMap = null;
          try {
               stringObjectMap = meSmsBusiness.sendVerificationCode(phoneNo, ext);
               result.setSuccessful(true);
               result.setResponseData(stringObjectMap.toString(), null);
               result.setDataType(SampleResult.TEXT);
          } catch (Exception e) {
               getLogger().error("LqueryTakeRegNo response error : " + e.getMessage());
               result.setSuccessful(false);
          }
          end = System.currentTimeMillis();
          return result;
     }


     @Override
     public void teardownTest(JavaSamplerContext arg0) {
          end = System.currentTimeMillis();
          getLogger().info("    cost time: " + (end - start) + "ms");
     }

}

然后打成jar包 放在D:\tool\apache-jmeter-4.0\lib\ext 目录下
注意最好使用和maven版本一样的 客户端

然后打开jmeter
选择需要测试的类 填写参数


image.png

点击运行

image.png

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,561评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,218评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,162评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,470评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,550评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,806评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,951评论 3 407
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,712评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,166评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,510评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,643评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,306评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,930评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,745评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,983评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,351评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,509评论 2 348

推荐阅读更多精彩内容