欢迎, 游客
用户名 密码: 记住我
Jmeter 性能测试工具专版
  • 页:
  • 1

主题: 详解JMeter最佳实践经验--之BeanShell服务器

详解JMeter最佳实践经验--之BeanShell服务器 2014-10-21 01:25 #1

  • summer
  • 离线
  • 板块老大
  • 帖子: 54
  • 声望: 0
1. BeanShell服务器

BeanShell解释器有一个非常有用的特性,它表现得的一台服务器,可以通过Telnet或者HTTP访问。

这里没有安全机制。任何人只要能连接上对应端口,就能执行任何BeanShell命令。这些命令可以提供对JMeter应用程序和主机不受限制的访问。不要启动BeanShell服务器,除非已经对端口访问做了保护,例如,通过防火墙。

如果测试人员确实希望使用BeanShell服务器,请在jmeter.properties文件中定义如下属性:

beanshell.server.port=9000
beanshell.server.file=../extras/startup.bsh
在上面的例子中,BeanShell服务器将会被启动,并监听端口9000和9001。端口9000将会用于HTTP访问。端口9001将会用于Telnet访问。startup.bsh文件将被BeanShell服务器处理,它可以用于定义各种函数及初始化变量。文件startup中定义了设置/打印JMeter及系统属性的各种方法。测试人员可以在JMeter控制台中看到如下内容:
Startup script running
Startup script completed
Httpd started on port: 9000
Sessiond started on port: 9001
这里有一个实际例子,假设测试人员有一个以非GUI模式长期运行的JMeter测试,并且测试人员希望能在测试运行期间不定时改变吞吐率。测试计划中包含一个恒定的吞吐率定时器,它是以属性的形式定义的,形如${__P(throughput)}。如下BeanShell命令可以被用于改变测试:
printprop("throughput");  
curr=Integer.decode(args[0]); // Start value
inc=Integer.decode(args[1]); // Increment
end=Integer.decode(args[2]); // Final value
secs=Integer.decode(args[3]); // Wait between changes
while(curr <= end){
setprop("throughput",curr.toString()); // Needs to be a string here
Thread.sleep(secs*1000);
curr += inc;
}
printprop("throughput");


该脚本可以被存储到一个文件中(如throughput.bsh),接着使用bshclient.jar将其传递给BeanShell服务器。例如:
java -jar ../lib/bshclient.jar localhost 9000 throughput.bsh 70 5 100 60

2.BeanShell脚本编程

1)回顾

每一个BeanShell测试元件都有独立的解释器备份(针对每个线程)。如果测试元件被重复调用,例如,被放在循环之中,那么在多次调用间解释器将被保留,除非选中了"Reset bsh.Interpreter before each call"复选框,如图11-6所示。


(点击查看大图)图11-6 BeanShell采样器
一些长期运行的测试可能导致解释器使用很多内存;如果遇到这种情况,请尝试使用Reset选项。

测试人员可以使用命令行解释器,以便在JMeter之外测试BeanShell脚本:

$ java -cp bsh-xxx.jar[;other jars as needed] bsh.Interperter file.bsh [parameters] 
或者:
$ java -cp bsh-xxx.jar bsh.Interperter
bsh% source("file.bsh");
bsh% exit(); // or use EOF key (e.g. ^Z or ^D)


2)共享变量

变量可以被定义在startup(初始化)脚本中。它们将会被一直保留下来,跨越测试元件的多次调用,除非使用到了reset选项。

脚本同样可以访问JMeter变量,只需使用"vars"变量的get()和put()方法,例如,vars.get("HOST"); vars.put("MSG","Successful"); 。get()和put()方法只支持字符串类型的变量,不过这里还有getObject()和putObject()方法可以被用于任何对象。JMeter变量对线程而言是局部的,但是可以被所有测试元件使用(不仅是BeanShell)。

如果测试人员需要在线程间共享变量,那么可以使用JMeter属性:

import org.apache.jmeter.util.JmeterUtils;  
String value=JmeterUtils.getPropDefault("name","");
JmeterUtils.setProperty("name","value");
没有无缘无故的爱,没有无缘无故的恨
  • 页:
  • 1