利用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




原创粉丝点击