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、如何使用
- 修改jmeter.properties端口说明:9000 用于http协议访问,9001用于Telnet协议访问
-
测试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工作正常
-
举个具体的荔枝:在一个长时间执行的测试计划中,不断增加吞吐量控制,直到目标值
-
创建测试计划,配置如下面的图
任意配置一个简单的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