一、   测试脚本编写

脚本可参考git项目: https://github.com/aland-1415/dubbo-interface-test.git

1、 pom依赖

(注意添加的jmeter版本要与运行时使用的版本一致,这里使用的是3.1版本)

    <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<spring.version>4.3.5.RELEASE</spring.version>
</properties> <dependencies>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_core</artifactId>
<version>3.1</version>
<exclusions>
<exclusion>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
</exclusion>
<exclusion>
<groupId>commons-math3</groupId>
<artifactId>commons-math3</artifactId>
</exclusion>
<exclusion>
<groupId>commons-pool2</groupId>
<artifactId>commons-pool2</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_java</artifactId>
<version>3.1</version>
<exclusions>
<exclusion>
<groupId>commons-math3</groupId>
<artifactId>commons-math3</artifactId>
</exclusion>
<exclusion>
<groupId>commons-pool2</groupId>
<artifactId>commons-pool2</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
<exclusions>
<exclusion>
<artifactId>spring</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency> <dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.3</version>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency> <!--添加业务的jar包依赖--> <!--压测接口所需要的包-->
<dependency>
<groupId>com.dmall</groupId>
<artifactId>rcs-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies> <build>
<plugins>
<!--复制jar包插件,将使用到的jar包,复制到target/lib中-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>target/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin> <plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<id>add-resource</id>
<phase>generate-resources</phase>
<goals>
<goal>add-resource</goal>
</goals>
<configuration>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>*</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
</plugins> <resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*</include>
</includes>
<filtering>true</filtering>
</resource>
<!--设置自动替换-->
</resources> </build>

pom.xml

2、 dubbo服务配置(dubbo-config.xml)

<?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: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://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd
"> <dubbo:application name="dmall-performance-test " owner="dmalltest" /> <!-- 线上环境 注册中心暴露发现服务地址 -->
<!--
<dubbo:registry address="zookeeper://192.168.90.148:2181?backup=192.168.90.149:2181,192.168.90.150:2181"/>
--> <!-- 测试环境 注册中心暴露发现服务地址,测试脚本使用 -->
<!--
<dubbo:registry address="zookeeper://testzk1.dmall.com:2181?backup=testzk2.dmall.com:2181,testzk3.dmall.com:2181,testzk4.dmall.com:2181,testzk5.dmall.com:2181"/>
--> <!-- dev环境 注册中心暴露发现服务地址,编写脚本调试使用 -->
<dubbo:registry address="zookeeper://devzk1.dmall.com:2181?backup=devzk2.dmall.com:2181,devzk3.dmall.com:2181"/> <!--<dubbo:registry address="${dubbo.zookeeper.address }"/> --> <!--erp系统接口接口压测-->
<dubbo:reference id="recServer" interface="com.dmall.rcs.api.RcsServer" timeout="10000" check="false"/> </beans>

dubbo-config.xml

3、 接口测试代码

 public class RcsServerTest implements JavaSamplerClient {//也可继承 AbstractJavaSamplerClient

     ApplicationContext context = new ClassPathXmlApplicationContext("dubbo-config.xml");
RcsServer recServer=(RcsServer) context.getBean("recServer");
long start = 0, end = 0; //运行runTest方法前会调用此方法
@Override
public void setupTest(JavaSamplerContext argv0) {
start = System.currentTimeMillis();
} //Jmeter界面手工输入的参数,可以在此方法中获取
@Override
public Arguments getDefaultParameters() {
Arguments args = new Arguments();
args.addArgument("primaryKey", "165987729026");
args.addArgument("useType", "post_order");
args.addArgument("businessDate", "2019-10-14 00:00:05");
args.addArgument("userId", "96322526");
args.addArgument("clientIp", "183.228.99.149");
return args;
} //接口测试代码
@Override
public SampleResult runTest(JavaSamplerContext arg0) {
String sys = arg0.getParameter("sys", "test");//arg0是运行jmeter时传的参数
String primaryKey = arg0.getParameter("primaryKey");
String useType = arg0.getParameter("useType");
String businessDateStr = arg0.getParameter("businessDate");
String userId = arg0.getParameter("userId");
String clientIp = arg0.getParameter("clientIp");
String exParameterStr = arg0.getParameter("exParameter");
RcsRequest rcsRequest = new RcsRequest(sys, primaryKey, useType, businessDate, userId, clientIp, exParameter); SampleResult sr = new SampleResult();
sr.setSamplerData("系统RecServer测试");
//jmeter开始计响应时间标记
sr.sampleStart(); //调用被测试接口
RcsResponse response = recServer.discern(rcsRequest); try {
sr.setSuccessful(true);
//jmeter最后显示的响应结果
sr.setResponseData("风险系数:" + response.getRiskScore());
sr.sampleEnd();
} catch (Exception e) {
sr.setSuccessful(false);
e.printStackTrace();
} //结束计响应时间标记
sr.sampleEnd();
return sr;
} //运行runTest方法后会调用此方法
@Override
public void teardownTest(JavaSamplerContext context) {
end = System.currentTimeMillis();
System.out.println("cost time: " + (end - start));
} //用于开发时直接运行调试用
public static void main(String[] args){
RcsServerTest test = new RcsServerTest();
Arguments params = test.getDefaultParameters();
JavaSamplerContext arg0 = new JavaSamplerContext(params);
test.setupTest(arg0);
test.runTest(arg0);
}
}

注意:最终输出jar包时,要确保取样周期内,没有不相干的输出操作。否则,会影响【响应时间】统计数据的准确性

4、打包

(注意是打jar包,这个需要在pom文件里配置<packaging>jar</packaging>)

项目结构:

dubbo.xsd 文件下载地址: https://github.com/alibaba/dubbo

方法一:mvn clean -Ptest install

将  “项目路径/target” 下生成的jar包拷贝到 “jmeter安装目录/lib/ext”

将  “项目路径/target/lib” 下所有的依赖jar包拷贝到 “jmeter安装目录/lib”

方法二:用Eclipse的export导出可执行的jar包文件

将生成的jar包及同名文件夹一起拷贝到 “jmeter安装目录/lib/ext”

二、   在jmeter上运行脚本

1、 编写jmeter脚本

(1)     添加线程组

(2)     添加java请求

(3)     选择测试接口

(4)     保存

2、 非GUI运行脚本命令

sudo sh  jmeter安装目录/bin/jmeter.sh -n -t test.jmx -l result.jtl

test.jmx是jmeter脚本

result.jtl 是最后存放测试结果的文件

:linux上测试时可使用dstat 命令,可实时监控服务器CPU、磁盘、网络等基本情况

三、   压测报告生成

./jmeter安装目录/bin/jmeter.sh -g result.jtl -e -o resultReport

最后生成的报告是html存放于resultReport文件中,打开index.html即可

也可以在运行测试命令时同时加报告生成命令:

sudo sh  jmeter安装目录/bin/jmeter.sh -n -t test.jmx -l result.jtl -e -o resultReport

附:

#coding=utf-8

import os

def mergeJTL(filedir):
filenames=os.listdir(filedir)
f=open('result.jtl','w',encoding='utf-8')
#文件计数器
num=0
for filename in filenames:
if filename=="result.jtl" or filename[-3:]!="jtl":
pass
else:
print("将要开始合并的文件是:"+filename)
filepath = filedir+'/'+filename
for line in open(filepath,encoding='utf-8'):
lineList=line.split(",")
#去除自第二个并入的文件开始的首行文字内容
if num!=0 and "timeStamp" in line:
pass
#去除数据不为16列或17列的
elif len(lineList)!=16 and len(lineList)!=17:
pass
#去除每行第一列不为13位时间戳的数据
elif num!=0 and len(lineList[0])!=13:
pass
else:
f.writelines(line)
num=num+1
f.close()
print(str(num)+"个文件合并成功!")

用于手动合并jtl文件脚本

四、   常见问题处理

1、 注意所有的路径不要包含中文;

2、 许多打开jmeter就报错可能是因为引用的jar包与jmeter已有的jar冲突了且版本不一致,可删除其中重复的jar包或者把两边jar包的版本号修改为相同的

3、 导出的jar包放到jmeter的lib/ext目录下,创建测试计划->创建线程组->创建java请求,找不到编写的方法;

问题原因:编写java脚本时,jdk的版本使用的是1.8,而本机jmeter使用的是1.7

解决办法:2边jdk版本修改一致

4、 从jmeter读取中文显示问号的问题

解决办法:脚本中对要输出的对象进行强制转换

使用jmeter对dubbo接口进行性能测试教程及常见问题处理的更多相关文章

  1. jmeter测试dubbo接口

    本文讲解jmeter测试dubbo接口的实现方式,文章以一个dubbo的接口为例子进行讲解,该dubbo接口实现的功能为: 一:首先我们看服务端代码 代码架构为: 1:新建一个maven工程,pom文 ...

  2. 使用Jmeter测试Dubbo接口(参数设置篇)

    WebSocket接口需要下载dubbo插件才能使用 本次下载的版本为jmeter-plugins-dubbo-1.3.6,下载完成后jar文件放到\lib\ext目录下 由于工作需要,最近需要对du ...

  3. 『动善时』JMeter基础 — 52、使用JMeter测试Dubbo接口

    目录 1.Dubbo介绍 2.准备测试Dubbo接口的环境 3.Dubbo Sample界面详解 4.Dubbo Sample组件的使用 (1)测试计划内包含的元件 (2)使用zookeeper协议请 ...

  4. JMeter测试dubbo接口总结

    Jmeter 测试dubbo 接口 1. 安装JMeter 安装到/usr/local下 2. github上下载 jmeter-plugins-dubbo-x.x.x-jar-with-depend ...

  5. 通过Jmeter对Dubbo接口进行接口及性能测试

    dubbo接口/性能测试 dubbo简介 zookeeper简介.安装及配置 dubbo服务端demo dubbo客户端调用 jmeter工程改造及接口调用 读取jmeter参数用于dubbo性能测试 ...

  6. Jmeter实现dubbo接口压测案例

    当前项目中重构了消息服务,需要对消息服务接口做性能压测,评估消息服务的性能情况 通过和开发对接,目前消息服务是通过dubbo接口对内提供服务,所以才有了这边文章的记录 最初的压测这个dubbo接口有三 ...

  7. Jmeter测试dubbo接口填坑

    通过jmeter测试dubbo的方法网上有很多帖子,需要的自己度娘去就可以. 使用的时候有个问题需要提示一下,因为我碰到了,还耽误了一些时间,不说中间的过程.直接说处理方式: 问题是这样的: 将dub ...

  8. jmeter5.1测试dubbo接口

    dubbo接口功能介绍 客户端输入uncleyong(当然,也可以是其他字符串),服务端返回hello uncleyong 开发dubbo服务jmeter客户端 idea中创建模块dubbo_jmet ...

  9. 利用jmeter+JAVA对RPC的单接口(dubbo接口等)进行性能测试

    建立JAVA项目 建立maven项目,加入Jmeter所需要的JAR包依赖. POM.xml  加入如下: <dependency> <groupId>org.apache.j ...

随机推荐

  1. 高通平台sensor框架图【学习笔记】

  2. Windows curl开启注意事项

      php.ini 开启curl扩展 设置有时候开启之后,curl还是不行:将php目录下的libssh2.dll复制到apache/bin下.(基本上可以成功) 如果没有开启成功,将php安装目录下 ...

  3. java实现的一个【快速排序 】算法【原创】

    import java.util.Arrays; import org.apache.commons.lang.ArrayUtils; public class Test { public stati ...

  4. Roberts算子

    https://blog.csdn.net/likezhaobin/article/details/6892176 https://zhuanlan.zhihu.com/p/35032299 Robe ...

  5. H5+js调用相机

    在机缘巧合之下,了解到用HTML5和javascript调用摄像头来实现拍照功能,今天就把大致原理写下来.页面布局很简单,就是一个input标签,两个HTML5元素video.canvas和一个but ...

  6. js---用对象来放置变量和方法

    在写JS的时候,可以考虑使用对象来放置命名的变量,以及常用的方法. 简单示例: var func = { name:'张三', showName:function(name){ console.log ...

  7. java.lang.ClassNotFoundException: com.netflix.hystrix.contrib.javanica.aop.aspectj.HystrixCommandAspect

    添加这个依赖 <dependency> <groupId>com.netflix.hystrix</groupId> <artifactId>hystr ...

  8. windows下tomcat日志的坑

    最近在调试工程,想着在windows下多开窗口操作方便,结果发现日志竟然不全,百思不得其解.最后发现竟然是部署的坑. 之前的部署都是在bin目录下运行service.bat安装服务后了事,启停都通过t ...

  9. EasyDSS高性能RTMP、HLS(m3u8)、HTTP-FLV、RTSP流媒体服务器功能简介---实时数据统计报表、视频文件上传、点播、分享、集成

    熟悉EasyDSS流媒体服务器的小伙伴应该都知道,EasyDSS通过将EasyRTMP推流的直播流进行直播转码.智能处理.视频分发,再通过 CDN 分发节点分发到终端播放 SDK为观众播放高清低延时的 ...

  10. WPF之图片处理系列(19/590)

    https://www.cnblogs.com/Big-Head/p/12068230.html