一、   测试脚本编写

脚本可参考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. Pyhton学习的基础

    函数->功能, 如print(),input(),range(), 方法->功能, 如index()(尽量不用此方法),find(),类里面的函数就叫做方法 容器->列表,字符串,元 ...

  2. gradle/gradle plugin/Android studio关系

    gradle - 构建工具,存储于Users/stono/.gradle/wrapper/dists Adroid Studio- IDE Gradle plugin - 在AS中使用Gradle的插 ...

  3. UltraISO安装windows10时0x8007000D错误解决办法

    进入安装界面之后提示错误:windows无法打开所需的文件 F:\Sources\install.wim.请确保安装所需的所有文件可用,并重新启动安装.错误代码:0x8007000D 原因: 肯定是i ...

  4. 爬虫中采集动态HTML介绍

    JavaScript JavaScript 是网络上最常用也是支持者最多的客户端脚本语言.它可以收集 用户的跟踪数据,不需要重载页面直接提交表单,在页面嵌入多媒体文件,甚至运行网页游戏. 我们可以在网 ...

  5. 查找算法(6)--Block search--分块查找

    1. 分块查找 (1)说明分块查找又称索引顺序查找,它是顺序查找的一种改进方法. (2)算法思想:将n个数据元素"按块有序"划分为m块(m ≤ n).每一块中的结点不必有序,但块与 ...

  6. Redis 服务监控 redis-faina 命令查看 和 redis-live 界面查看

    Redis现在在很多公司中应用已经很广泛了,但是如何监控redis,实时的观察redis的性能,下面就关于Redis的常用监控介绍一下. 一.使用redis自带的info命令和monitor命令现在常 ...

  7. Vue打包发布到Tomcat后,刷新报错404解决方法

    在应用下面加 WEB-INF 建 web.xml 内容如下 <?xml version="1.0" encoding="ISO-8859-1"?> ...

  8. java Random 带权重的随机选择

    实际场景中,经常要从多个选项中随机选择一个,不过,不同选项经常有不同的权重. /** * Created by xc on 2019/11/23 * 带权重的随机选择 */ public class ...

  9. {Redis}NOAUTH Authentication required. Linux.cenOS

    问题 [root@VM_0_12_centos redis]# ./bin/redis-cli -p 6379 127.0.0.1:6379> INFO NOAUTH Authenticatio ...

  10. Java之输入和输出

    输出 在前面的代码中,我们总是用System.out.println()来向屏幕输出一些内容: println是print line的缩写,表示输出并换行.因此,如果输出后不想换行,可以用print( ...