您好!
欢迎来到京东云开发者社区
登录
首页
博文
课程
大赛
工具
用户中心
开源
首页
博文
课程
大赛
工具
开源
更多
用户中心
开发者社区
>
博文
>
Jmeter压测实战:Jmeter二次开发之JSF采样器实现
分享
打开微信扫码分享
点击前往QQ分享
点击前往微博分享
点击复制链接
Jmeter压测实战:Jmeter二次开发之JSF采样器实现
自猿其说Tech
2022-04-14
IP归属:未知
794640浏览
测试
### 1 前言 Jmeter是Apache基金会下的一款应用场景非常广的压力测试工具,具备轻量、高扩展性、分布式等特性。Jmeter已支持实现HTTP、FTP、JAVA、TCP、JDBC等多种采样器,方便对不同的接口类型进行请求测试及压力测试。如果被测试的接口Jmeter当前不支持,那就需要单独开发自定义采样器实现接口的请求调用,比如JSF这种京东自研的RPC类接口,或者京东JMQ消息队列接口。 本文介绍如何开发Jmeter自定义采样器,同时深刻理解Jmeter的插件化机制及高扩展性特性。 备注:JSF是京东自研的RPC服务框架,类似于开源的dubbo服务的分布式框架,具备轻量级,更佳的性能,兼容旧版本协议等优化特性。RPC框架负责屏蔽底层的传输方式(TCP或UDP)、序列号方式(XML/JSON/二进制)和通信细节,从而让程序员专注于业务的实现。 ### 2 开发具备能力 本文Jmeter的二次开发,需要人员具备以下能力: - Java基础开发(包括GUI API) - Maven基本使用 - Jmeter基本使用 ### 3 实战整体流程图 ![](//img1.jcloudcs.com/developer.jdcloud.com/eae67839-7a4c-4d50-bcfa-94779207275b20220414140852.png) ### 4 采样器GUI实现 #### 4.1 新建项目 本次开发依赖版本 - JDK 1.8.0 - Maven 3.6.3 - Jmeter 5.4.3 新建maven项目,这里项目名为:JSF_Sampler 因为是基于Jmeter的扩展,需要依赖包Jmeter两个核心包,分别是: - ApacheJMeter_core - ApacheJMeter_java 这里还依赖了支持JSF调用的三方包 pom.xml文件核心配置如下 ```xml <groupId>com.jd.jmeter.jsf</groupId> <artifactId>JSF_Sampler</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <jmeter-version>5.4.3</jmeter-version> </properties> <dependencies> <!-- Jmeter核心依赖包,提供核心API接口 --> <dependency> <groupId>org.apache.jmeter</groupId> <artifactId>ApacheJMeter_core</artifactId> <version>${jmeter-version}</version> </dependency> <!-- 提供Java request等sampler API接口 --> <dependency> <groupId>org.apache.jmeter</groupId> <artifactId>ApacheJMeter_java</artifactId> <version>${jmeter-version}</version> </dependency> <dependency> <!-- JD内部工具包,内部封装了JSF接口的调用 --> <groupId>com.jd.qa</groupId> <artifactId>selena-core</artifactId> <version>0.0.36-SNAPSHOT</version> <exclusions> <exclusion> <artifactId>core-utils</artifactId> <groupId>com.jd.qa</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.jd.qa</groupId> <artifactId>core-utils</artifactId> <version>0.0.4.1-SNAPSHOT</version> </dependency> </dependencies> ``` #### 4.2 继承实现AbstractSamplerGui类 实现类依次实现以下几个步骤 1. 新建实现类并继承 AbstractSamplerGui 注意:实现类的包名必须包含xxx.gui.xxx,否则无法加载自定义的GUI实现类。 2. 初始化GUI组件,GUI使用Jmeter封装好的组件,界面元素包括: 杰夫接口名、杰夫别名、杰夫方法及入参 3. 同时需要重写以下几个方法 - getStaticLabel() - createTestElement() - modifyTestElement() - configure() - clearGui() 重写方法功能及实现代码如下: ```java /** * GUI中显示的sampler的名称 */ @Override public String getStaticLabel(){ return "JSF Sampler"; } /** * 将界面中的数据设置到新建的sampler实例 */ @Override public TestElement createTestElement() { JsfSampler jsfSampler = new JsfSampler(); this.setUpSamplerProp(jsfSampler); return jsfSampler; } /** * 将界面中测试数据设置到新建的sampler实例 */ @Override public void modifyTestElement(TestElement testElement) { JsfSampler jsfSampler = (JsfSampler) testElement; this.setUpSamplerProp(jsfSampler); } /** * 界面与sampler之间的数据交换 * 特别注意:一定要先调用父类的configure方法,会交换默认的一些数据 */ @Override public void configure(TestElement element) { super.configure(element); JsfSampler jsfSampler = (JsfSampler) element; this.interfaceField.setText(jsfSampler.getJsfInterfaceName()); this.aliasField.setText(jsfSampler.getJsfAliasName()); this.methodField.setText(jsfSampler.getJsfMethod()); this.textMessage.setText(jsfSampler.getJsfBody()); } /** * 界面reset时,可以显示默认值 * 特别注意:一定要先调用父类的configure方法,会reset一些默认的数据 */ @Override public void clearGui() { super.clearGui(); this.interfaceField.setText("com.jd.ldop.oms.api.order.OrderApi"); this.aliasField.setText("oms-production"); this.methodField.setText("receiveOrderInfo"); this.textMessage.setText("{\n" + "\"preNum\":10,\n" + "\"customerCode\":\"010K258778\",\n" + "\"orderType\":\"0\"\n" + "}"); } ``` 最终GUI页面元素如下,即JSF接口四要素:接口名、别名、方法、入参 ![](//img1.jcloudcs.com/developer.jdcloud.com/68341bb9-5f93-4acc-be36-c40adc49850a20220414141112.png) ### 5 采样器核心调用实现 #### 5.1 新建采样器实现类 - 新建实现类并继承 AbstractSampler,同时实现接口TestStateListener - 注意:采样器实现类的包名必须包含xxx.functions.xxx,否则无法加载自定义的Sampler实现类。 - 实现Sampler参数属性getter、setter方法 #### 5.2 重写采样器核心方法 实现Sampler以下几个方法,具体方法实现见下方代码 - sample() - testStarted() - testStarted(String s) - testEnded() - testEnded(String s) ```java //以下四个方法空实现重写即可,但是必须要写,否则无法识别 @Override public void testStarted() { } @Override public void testStarted(String s) { } @Override public void testEnded() { this.testEnded("local"); } @Override public void testEnded(String s) { } /** * 核心实现方法,此方法实现对被测接口的请求方法及返回处理 * 其中,SampleResult封装了控制请求的发送、response结果处理的方法 */ @Override public SampleResult sample(Entry entry) { SampleResult sampleResult = new SampleResult(); sampleResult.setSampleLabel(getName()); //请求发送开始 sampleResult.sampleStart(); String aliasName = getJsfAliasName().split(";")[0]; String ip = getJsfAliasName().split(";")[1].split(":")[0]; String port = getJsfAliasName().split(";")[1].split(":")[1]; try { //这里使用了封装好请求JSF的包,只需要传入JSF四要素即可 JsfBuilder jsfBuilder = JsfBuilder .builder() .aliasName(aliasName) .interfaceName(getJsfInterfaceName()) .methodName(getJsfMethod()) .prams(getJsfBody()) .ip(ip) .port(port) .build(); String jsfRes = jsfBuilder.hr(); //请求发送结束 sampleResult.sampleEnd(); //处理返回的response sampleResult.setSuccessful(true); sampleResult.setResponseCodeOK(); sampleResult.setResponseCode("SUCCESS"); sampleResult.setResponseMessage(jsfRes); sampleResult.setResponseData(jsfRes,null); } catch (BusinessException e) { sampleResult.sampleEnd(); sampleResult.setSuccessful(false); sampleResult.setResponseCode("FAIL"); sampleResult.setResponseMessage("Exception" + e); e.printStackTrace(); log.error("JSF接口请求报错"); } return sampleResult; } ``` #### 5.3 最终项目结构 ![](//img1.jcloudcs.com/developer.jdcloud.com/19b0234d-7288-4a90-a2ec-0b13e3319b2620220414141238.png) ### 6 Jmeter加载扩展包 以上开发完成,打包此项目,注意这里的打包要包含依赖包。 #### 6.1 maven构建配置 ```xml <build> <finalName>${project.artifactId}</finalName> <defaultGoal>install</defaultGoal> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> <executions> <execution> <id>assemble-all</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build> ``` #### 6.2 项目打包 打包指令如下 ``` mvn package -Dmaven.test.skip=true ``` ![](//img1.jcloudcs.com/developer.jdcloud.com/33c19089-5d44-4926-aaa2-7a3ec621d2a820220414141354.png) #### 6.3 Jmeter加载扩展包 将打包后的扩展包放置到Jmeter的ext目录:apache-jmeter-5.4.3/lib/ext/ ![](//img1.jcloudcs.com/developer.jdcloud.com/f0c74a52-72e5-48cc-8b08-3841876bce8120220414141432.png) 启动Jmeter后,Jmeter会自动加载ext目录中的扩展包,可以从日志控制台看到初始化GUI日志 ![](//img1.jcloudcs.com/developer.jdcloud.com/70ffee96-38e7-47d9-95cb-f6faf62d8bc420220414141444.png) ![](//img1.jcloudcs.com/developer.jdcloud.com/1d5510d7-7852-472b-9df8-a1b5d10e82ce20220414141458.png) ### 7 测试JSF调用 #### 7.1 新建采样器 新建线程组->新建采样器->JSF Sampler (本次新增的采样器) ![](//img1.jcloudcs.com/developer.jdcloud.com/08f959e5-4951-4241-aa8e-d2d19e7900ec20220414141518.png) #### 7.2 配置采样器请求参数及结果树 配置JSF请求参数如下 ![](//img1.jcloudcs.com/developer.jdcloud.com/3a78ae6a-8b04-478c-963b-0fcdd361399420220414141544.png) #### 7.3 发送请求后查看结果树 发送请求后查看结果树 ![](//img1.jcloudcs.com/developer.jdcloud.com/6ffaf193-1078-4524-868a-abd083445c2720220414141607.png) ### 8 总结 本文通过自定义采样器实现了JSF接口的调用,希望通过本项目大家可以学习到: 如何二次开发Jmeter,实现自己特有的采样器。 理解为何官方介绍Jmeter是插件化的,高扩展性特性。 更好的理解Jmeter内部处理机制。 ### 9 思考 - Jmeter的HTTP采样器的实现方法是如何实现的 - 如何实现定制化Jmeter的HTTP采样器支持HTTPs ------------ ###### 自猿其说Tech-JDL京东物流技术与数据智能部 ###### 作者:苗浩冲
原创文章,需联系作者,授权转载
上一篇:一次结算单文件上传FTP失败的问题排查心得
下一篇:荷兰MCA-之无人自提门店解码
相关文章
安全测试之探索windows游戏扫雷
Jmeter压测实战:Jmeter二次开发之JSF采样器实现
Laputa自动化测试框架介绍
自猿其说Tech
文章数
426
阅读量
2149964
作者其他文章
01
深入JDK中的Optional
本文将从Optional所解决的问题开始,逐层解剖,由浅入深,文中会出现Optioanl方法之间的对比,实践,误用情况分析,优缺点等。与大家一起,对这项Java8中的新特性,进行理解和深入。
01
Taro小程序跨端开发入门实战
为了让小程序开发更简单,更高效,我们采用 Taro 作为首选框架,我们将使用 Taro 的实践经验整理了出来,主要内容围绕着什么是 Taro,为什么用 Taro,以及 Taro 如何使用(正确使用的姿势),还有 Taro 背后的一些设计思想来进行展开,让大家能够对 Taro 有个完整的认识。
01
Flutter For Web实践
Flutter For Web 已经发布一年多时间,它的发布意味着我们可以真正地使用一套代码、一套资源部署整个大前端系统(包括:iOS、Android、Web)。渠道研发组经过一段时间的探索,使用Flutter For Web技术开发了移动端可视化编程平台—Flutter乐高,在这里希望和大家分享下使用Flutter For Web实践过程和踩坑实践
01
配运基础数据缓存瘦身实践
在基础数据的常规能力当中,数据的存取是最基础也是最重要的能力,为了整体提高数据的读取能力,缓存技术在基础数据的场景中得到了广泛的使用,下面会重点展示一下配运组近期针对数据缓存做的瘦身实践。
自猿其说Tech
文章数
426
阅读量
2149964
作者其他文章
01
深入JDK中的Optional
01
Taro小程序跨端开发入门实战
01
Flutter For Web实践
01
配运基础数据缓存瘦身实践
添加企业微信
获取1V1专业服务
扫码关注
京东云开发者公众号