Jmeter最佳实战之BeahShell Server

1、介绍

下面是官方文档

The BeanShell interpreter has a very useful feature - it can act as a server, which is accessible by telnet or http.

2、用处

使用BeahShell Server可以在测试计划运行期间,动态改变运行参数

场景举例:

一个需要长时间运行的测试计划,并且已经运行了数小时,如果需要修改参数,可以采取终止执行,设置参数,再次运行的方法,但这让人难以接受,此时动态修改参数就非常必要了

3、如何使用

  1. 修改jmeter.properties端口说明:9000 用于http协议访问,9001用于Telnet协议访问
  2. 测试server是否正常

    修改 jmeter.properties文件之后,启动jmeter客户端,在控制台可以看到上图中的信息,命令行可以看到下图中的信息

    jemter在extras 目录下提供了remote.bsh文件,可以用来测试。在bin目录下,执行

    java -jar ../lib/bshclient.jar localhost 9000 ../extras/remote.bsh

    命令说明:使用bsh客户端(bshclient.jar)通过本地9000端口,将bsh文件发送给beahshell server执行 上面结果说明beanshell server工作正常

  3. 举个具体的荔枝:在一个长时间执行的测试计划中,不断增加吞吐量控制,直到目标值

  • 创建测试计划,配置如下面的图

    任意配置一个简单的http请求,此计划中JSR223后置处理器,为了处理响应编码的问题,可以忽略,给http请求配置一个Constant Throughput Timmer,并参数化入参,即${__P(throughput, 6)} 

  • 线程组配置如下,同样使用参数化

  • 编写beanshell脚本,保存为在extras目录下,文件名为param.bsh,脚本内容如下图

    printprop("param");
    
    
    curr = Integer.decode(args[0]); // current value
    inc = Integer.decode(args[1]);  // incresment
    end = Integer.decode(args[2]);  // final value
    secs = Integer.decode(args[3]);  // wait 
    
    
    while(curr <= end){
        setprop("throughput", curr.toString());
        Thread.sleep(secs*1000);
        curr += inc;
    }
    
    printprop("param");

    说明:脚本包含一段简单的循环逻辑,不断设置throughput的值。文件中使用的方法,如printprop()、setprop()等,都是startup.bsh文件中定义的,如下图startup.bsh文件部分内容

    print("Startup script running");
    
    import org.apache.jmeter.util.JMeterUtils;
    
    getprop(p){// get a JMeter property
    return JMeterUtils.getPropDefault(p,"");
    }
    
    setprop(p,v){// set a JMeter property
    print("Setting property '"+p+"' to '"+v+"'.");
    JMeterUtils.getJMeterProperties().setProperty(p, v);
    }
    
    printprop(p){// print a JMeter property
    print(p + " = " + getprop(p));
    }
    
    loglevel(String priority, String category){
    // Previous implementation delegated the call to LoggingManager which
    // was deprecated since JMeter 3.2
    }
    
    logdebug(String text){
    loglevel("DEBUG",text);
    }
    
    loginfo(String text){
    loglevel("INFO",text);
    }
    
    // Define routines to stop the test or a thread
    stopEngine(){// Stop the JMeter test
    print("Stop Engine called");
    org.apache.jmeter.engine.StandardJMeterEngine.stopEngine();
    }
    
    stopEngineNow(){// Stop the JMeter test now
    print("Stop Engine NOW called");
    org.apache.jmeter.engine.StandardJMeterEngine.stopEngineNow();
    }
    
    stopThread(t){// Stop a JMeter thread
    print("Stop Thread "+t+" called");
    ok=org.apache.jmeter.engine.StandardJMeterEngine.stopThread(t);
    if (ok){print("Thread requested to stop");} else { print("Thread not found");}
    }
    
    stopThreadNow(t){// Stop a JMeter thread
    print("Stop Thread Now "+t+" called");
    ok=org.apache.jmeter.engine.StandardJMeterEngine.stopThreadNow(t);
    if (ok){print("Thread stopped");} else { print("Thread not found");}
    }
    
    getsysprop(p){// get a system property
    return System.getProperty(p,"");
    }
    
    setsysprop(p,v){// set a system property
    print("Setting property '"+p+"' to '"+v+"'.");
    System.setProperty(p, v);
    }
    
    printsysprop(p){// print a system property
    print(p + " = " + getsysprop(p));
    }
    
    print("Startup script completed");
  • CLI模式运行测试计划,在bin目录下执行命令(注意要在jmeter的bin目录下启动jmeter,否则可能会无法加载extras/startup.bsh,GUI模式下控制台会抛异常:could source ../extras/startup.bsh

    jmeter -n -t demo0304.jmx -l report_demo0304001.jtl -Jthreads=4 -Jduration=1

    此处-l参数可以不要,-J设置线程数和启动时间也为非必须,以为计划中设置了默认值

  • 通过执行.bsh文件,动态修改throughput参数,从而http请求控制吞吐量,下面是脚本运行结果

  • 写在后面:上面执行.bsh文件的方式,如下

    java -jar ../lib/bshclient.jar localhost 9000 ../extras/param.bsh 12 10 60 30

     使用了动态传入参数,即从命令行接收参数。当然完全可以不使用这种方式,将param.bsh文件定义参数部分修改如下,使用固定参数,可以有同样的效果,只是动态传入参数的方式更灵活

    curr = 12; // current value
    inc = 10;  // incresment
    end = 60;  // final value
    secs = 60;  // wait 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值