利用JMeter的Java请求采样器进行rpc接口的性能测试
来源:互联网 发布:画平面示意图软件 编辑:程序博客网 时间:2024/05/18 10:03
需要了解的基本知识
java编程
maven(环境配置、pom、goal)
性能测试
jmeter
RPC接口的基础知识
IDL
测试方法实现
创建maven项目并添加JMeter依赖
注意这里的依赖版本,与你所使用的JMeter客户端版本一致
<dependency><groupId>org.apache.jmeter</groupId><artifactId>ApacheJMeter_java</artifactId><version>3.0</version></dependency>
根据被测的RPC接口,需要添加被测接口的依赖。具体需要参考被测RPC接口文档。
测试代码示例
创建一个Java Class,继承AbstractJavaSamplerClient。
覆盖实现父类AbstractJavaSamplerClient中的以下四个方法:
- getDefaultParameters:设置被测RPC接口的参数。
- setupTest:初始化性能测试时的每个线程;执行runTest()方法前会调用此方法,可做一些初始化操作。
- runTest:性能测试时的线程运行体;对被测接口的调用、传参、结果处理和校验都可以在这里进行。
- teardownTest:测试结束方法,用于结束性能测试中的每个线程。执行runTest()方法后会调用此方法,可以做一些资源释放等操作
代码举例
package TUgcVideoService;import java.nio.charset.StandardCharsets;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.apache.thrift.TException;import com.csdn.TPageResult;import com.csdn.TRecommendParameter;import com.csdn.TRecommendType;import com.csdn.TUgcVideoService;public class TestRecommendVideos extends AbstractJavaSamplerClient {private TRecommendParameter parameter; /*** 参数设置,配置后Jmeter新建java sampler时会显示对应参数,测试时可编写jmeter脚本为参数赋值(与http sampler类似)*/public Arguments getDefaultParameters() {Arguments params = new Arguments(); params.addArgument("area", ""); params.addArgument("type", ""); params.addArgument("cookieId",""); params.addArgument("userId",""); params.addArgument("referenceId", ""); params.addArgument("page", ""); params.addArgument("size",""); return params;}/** * 执行runTest()方法前会调用此方法,可放一些初始化代码 * 这里对被测接口的参数进行了赋值,将JMeter页面上设置的参数值透传给被测的rpc接口 */ public void setupTest(JavaSamplerContext arg0) {this.parameter = new TRecommendParameter();if(arg0.containsParameter("area")){this.parameter.setArea(arg0.getParameter("area"));}if(arg0.containsParameter("type")){String type = arg0.getParameter("type");if(type.equalsIgnoreCase("USER")) {this.parameter.setType(TRecommendType.USER);}else if(type.equalsIgnoreCase("VIDEO")) {this.parameter.setType(TRecommendType.VIDEO);}else if(type.equalsIgnoreCase("COLLECTION")) {this.parameter.setType(TRecommendType.COLLECTION);}}if(arg0.containsParameter("cookieId")){this.parameter.setCookieId(arg0.getParameter("cookieId"));}if(arg0.containsParameter("userId")){this.parameter.setCookieId(arg0.getParameter("userId"));}if(arg0.containsParameter("referenceId")){this.parameter.setCookieId(arg0.getParameter("referenceId"));}if(arg0.containsParameter("page")){this.parameter.setCookieId(arg0.getParameter("page"));}if(arg0.containsParameter("size")){this.parameter.setCookieId(arg0.getParameter("size"));}}/** * 性能测试时的线程运行体,执行的业务方法放在这里。 */public SampleResult runTest(JavaSamplerContext arg0) {boolean success = true;//测试结果的标志位SampleResult sr = new SampleResult(); //初始化jmeter的java采样器sr.sampleStart(); //用来统计执行时间--start--//调用被测接口并根据接口返回结果设置response内容TUgcVideoService.Iface ugcVideoService = ServiceHelper.getThriftService(TUgcVideoService.Iface.class); try { TPageResult videoList = ugcVideoService.recommendVideos(this.parameter); if(videoList != null){ //此处只进行了基本的校验,如果不为null,认为success,设置ResponseMessage及ResponseCode //将返回数据set到responseData,但可能会影响性能//sr.setResponseData(videoList.deepCopy().toString().getBytes(StandardCharsets.UTF_8)); sr.setResponseMessageOK(); sr.setResponseCodeOK(); } else {//如果接口返回为null,则测试失败,设置ResponseMessage及ResponseCode及responseData success = false; //将返回数据set到responseData,但可能会影响性能 sr.setResponseData("null".getBytes()); sr.setResponseMessage("ERROR"); sr.setResponseCode("500"); } } catch (TException e) {//有exception,当然也是失败 success = false; sr.setResponseMessage(e.getMessage()); sr.setResponseCode("501"); }finally{ sr.sampleEnd(); //用来统计执行时间--end-- sr.setSuccessful(success); }return sr;}/** * 执行runTest()方法后会调用此方法,可放一些资源释放代码 */ public void teardownTest(JavaSamplerContext arg0) {//TODO:}}
编写代码时如需调试,可以使用JUnit单元测试,对你编写的接口进行测试。JUnit测试使用方法,请自行学习。
测试包的导出和使用
导出依赖的包:方法可参考 https://my.oschina.net/cloudcoder/blog/212648 (以eclipse为例)
maven构建打包
将依赖包及maven打的测试用的包都拷贝到jmeter的lib\ext目录下
启动(重启)JMeter
新建jmeter testplan,创建java采样器,选择你实现的java接口,设置相应参数进行测试。与http采样器的使用基本一致。
参考文档:
你应该知道的RPC原理:http://www.cnblogs.com/LBSer/p/4853234.html
基于maven构建JMeter的Java Request:http://huangke.info/ji-yu-mavenchuang-jian-jmeter-java-requestde-yi-lai-wen-ti/
Java Code Examples for org.apache.jmeter.protocol.java.sampler.JavaSamplerContext:http://www.programcreek.com/java-api-examples/index.php?api=org.apache.jmeter.protocol.java.sampler.JavaSamplerContext
在maven项目中使用Junit进行单元测试:http://www.jianshu.com/p/b8f6d00f72bd
maven pom.xml配置详解:http://blog.csdn.net/ithomer/article/details/9332071
使用JMeter进行性能测试 —“Java请求”方式:http://www.cnblogs.com/yuki-lau/archive/2013/04/20/3033010.html
- 利用JMeter的Java请求采样器进行rpc接口的性能测试
- 使用JMeter进行性能测试(Java请求)
- 使用JMeter进行性能测试(Java请求)
- 使用JMeter进行性能测试(Java请求)
- 使用JMeter进行性能测试(Java请求)
- jmeter性能测试,基于scf框架的"java请求"接口封装、环境配置与测试
- Jmeter--使用JMeter进行性能测试(Java请求)
- 【转载】使用JMeter的Java请求功能测试Hetty性能
- 使用JMeter的Java请求功能测试Hetty性能
- 使用JMeter进行性能测试之Java请求
- 使用JMeter进行性能测试之Java请求
- 使用JMeter进行性能测试之Java请求
- 利用Jmeter进行压力测试的步骤
- 使用Jmeter进行http接口性能测试
- 使用Jmeter进行http接口性能测试
- Jmeter的性能测试
- 利用JMeter的beanshell进行接口的加密处理
- 利用JMeter的beanshell进行接口的加密处理
- Markdown Editor
- boot中的行编辑功能
- Android自定义类关闭所有活动实现退出
- HTML5 Storage
- 灌水(python实现)
- 利用JMeter的Java请求采样器进行rpc接口的性能测试
- javascript addEventListener讲解
- 求1-100内能被3整除,不能被5整除的数字。
- 实例:python图像处理(Pillow+numpy)
- Java文件下载的几种方式
- HTML5 Local Storage
- 元件信息显示位置
- Android 下载文件推荐OKGO
- 静态代码分析