zoukankan      html  css  js  c++  java
  • Jmeter使用自定义编写代码

    原文地址:http://blog.csdn.net/li_ok/article/details/1487685

    我们在做性能测试时,有时需要自己编写测试脚本,很多测试工具都支持自定义编写测试脚本,比如LoadRunner就有很多自定义脚本的协议,比如"C Vuser","Java Vuser"等协议.同样,Jmeter也支持自定义编写的测试代码,不过与LoadRunner不同的是,Jmeter没有自带编译器,需要借助第三方编译器才能实现.下面举一个简单的Java自定义测试代码例子,使用Java编译器编写测试代码(Java编译器可以用Eclipse,JBulider等),实现功能为:判断输入的数字是否等于你指定的数,如果等于,则返回成功,如果小于,则提示该输入数字太小,如果大于,则提示该数字太大,如果不为数字,提示输入数字。然后在放到Jmeter中模拟10个用户测试,同时运行这段代码,具体实现如下:

    一、开始编写前的准备

    1、打开Java编译器,新建一个项目TestNumber,然后新建一个包test。

    2、从Jmeter的安装目录lib/ext中拷贝两个文件ApacheJMeter_core.jar和ApacheJMeter_java.jar到TestNumber项目中,然后引入这两个JAR包。

    3、在test包中新建一个类,类名为TestNum,该类继承AbstractJavaSamplerClient类,AbstractJavaSamplerClient存在于ApacheJMeter_java.jar这个JAR包中,引用即可调用。

    4、TestNum类在继承AbstractJavaSamplerClient类的时候,需要实现四个方法,分别是

    setupTest():初始化方法,用于初始化性能测试时的每个线程;

    getDefaultParameters():主要用于设置传入的参数;

    runTest():为性能测试时的线程运行体;

    teardownTest():测试结束方法,用于结束性能测试中的每个线程。

     

    二、具体的代码实现

     
    1 package test;
      2 
      3 import org.apache.jmeter.config.Arguments;
      4 import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
      5 import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
      6 import org.apache.jmeter.samplers.SampleResult;
      7 
      8 public class TestNum extends AbstractJavaSamplerClient{
      9     
     10     private SampleResult results;
     11     
     12     /**
     13      * 输入的数字
     14      */
     15     private String inNum;
     16     
     17     /**
     18      * 需要匹配的数字
     19      */
     20     private String resultNum;
     21 
     22     /**
     23      * 初始化方法,初始化性能测试时的每个线程
     24      * 实际运行时每个线程仅执行一次,在测试方法运行前执行,类似于LoadRunner中的init方法
     25      */
     26     public void setupTest(JavaSamplerContext jsc) {
     27         results = new SampleResult();
     28         
     29         inNum = jsc.getParameter("inNum", "");
     30         resultNum = jsc.getParameter("resultNum", "");
     31         
     32         if (inNum != null && inNum.length() > 0){
     33             results.setSamplerData(inNum);
     34         }
     35         
     36         if (resultNum != null && resultNum.length() > 0){
     37             results.setSamplerData(resultNum);
     38         }
     39     }
     40     
     41     /**
     42      * 设置传入参数
     43      * 可以设置多个,已设置的参数会显示到Jmeter参数列表中
     44      */
     45     public Arguments getDefaultParameters() {
     46         Arguments params = new Arguments();
     47         params.addArgument("inNum","");
     48         params.addArgument("resultNum", "66");
     49         return params;
     50     }
     51 
     52     /**
     53      * 性能测试时的线程运行体
     54      * 测试执行的循环体,根据线程数和循环次数的不同可执行多次,类似于Loadrunner中的Action方法
     55      */
     56     public SampleResult runTest(JavaSamplerContext arg0) {
     57         boolean flag = false;
     58         //定义一个事务,表示这是事务的起始点,类似于Loadrunner中的lr.start_transaction
     59         results.sampleStart();
     60         
     61         for (int i = inNum.length();--i >= 0;){
     62             if (!Character.isDigit(inNum.charAt(i))){
     63                 flag = false;
     64             }else{
     65                 flag = true;
     66             }
     67         }
     68         
     69         for (int j = resultNum.length();--j >= 0;){
     70             if (!Character.isDigit(resultNum.charAt(j))){
     71                 flag = false;
     72             }else{
     73                 flag = true;
     74             }
     75         }
     76         //定义一个事务,表示这是事务的结束点,类似于Loadrunner中的lr.end_transaction
     77         results.sampleEnd();
     78         
     79         if (flag){
     80             Integer num = Integer.parseInt(inNum);
     81             Integer rsNum = Integer.parseInt(resultNum);
     82             
     83             if (num == rsNum){
     84                 results.setDataEncoding("UTF-8");//因为响应的数据有中文,所以最好先设置编码
     85                 results.setResponseData("恭喜你,答对了O(∩_∩)O~
    答案是【"+resultNum+"】");//响应数据,对应结果树,其他response code等可以自己点出来
     86                 results.setSuccessful(true);//告诉系统返回正确还是错误
     87             } else if (num > rsNum){
     88                 results.setDataEncoding("UTF-8");
     89                 results.setResponseData("好像大了点~~~~(>_<)~~~~ 
    您输入的是【"+inNum+"】");
     90                 results.setSuccessful(false);
     91             }else {
     92                 results.setDataEncoding("UTF-8");
     93                 results.setResponseData("好像小了点~~~~(>_<)~~~~ 
    您输入的是【"+inNum+"】");
     94                 results.setSuccessful(false);
     95             }
     96             
     97         }else{
     98             results.setDataEncoding("UTF-8");
     99             results.setResponseData("请输入数字:~~~~(>_<)~~~~ 
    您输入的inNum是【"+inNum+"】,resultNum是【"+resultNum+"】");
    100             results.setSuccessful(false);
    101         }
    102         
    103         return results;
    104     }
    105 
    106     /**
    107      * 测试结束方法,结束测试中的每个线程
    108      * 实际运行时,每个线程仅执行一次,在测试方法运行结束后执行,类似于Loadrunner中的End方法
    109      */
    110     public void teardownTest(JavaSamplerContext arg0) {
    111     }
    112 
    113 }

    三、Jmeter运行分析

    1、将上述代码打包成jar包,生成的包名称为TestNumber.jar,将jar包拷贝到Jmeter的安装目录lib/ext下面。

    2、运行Jmeter,添加线程组及java请求,显示如下:

    其中,inNum为我们输入的值,因为需要用到多个用户,避免填写的麻烦,我们用随机数函数来随机抽取数字验证,resultNum为匹配的结果。

    3、添加监听器,这里我们添加查看结果树和聚合报告就好。

    4、结果显示如下图:

    查看结果树:

    我们可以看到,10个请求中,有一个请求回答正确,响应数据对应了我们的代码,表示执行成功。

    聚合报告:

    可以看到如上信息,请求用户为10个,因为我们的代码基本上没有任何含义,执行速度很快,所以其他值基本为0.

    通过上面的例子我们可以发现,使用Jmeter自定义Java测试代码,配合Jmeter自带的函数,就可以实现出LoadRunner中"Java Vuser"协议的绝大多数功能,而且是没有用户数限制和完全免费的(嘿嘿).上面的例子非常简单,而且没有任何实际意义,只是一个简单的Jmeter测试代码示例,用于抛砖引玉,希望大家一起交流,共同 进步. 

     资料下载地址:http://files.cnblogs.com/linglingyuese/TestNumber.zip

  • 相关阅读:
    [模板] 循环数组的最大子段和
    [最短路][几何][牛客] [国庆集训派对1]-L-New Game
    [洛谷] P1866 编号
    1115 Counting Nodes in a BST (30 分)
    1106 Lowest Price in Supply Chain (25 分)
    1094 The Largest Generation (25 分)
    1090 Highest Price in Supply Chain (25 分)
    树的遍历
    1086 Tree Traversals Again (25 分)
    1079 Total Sales of Supply Chain (25 分 树
  • 原文地址:https://www.cnblogs.com/majunBK/p/9394921.html
Copyright © 2011-2022 走看看