JMeter使用指南

发表于:2009-7-20 15:59

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:numberzero    来源:CSDN博客

  5. JMeter中的属性

  在JMeter中有Property的概念,他们通常有两种用处:首先他们代表了JMeter的配置信息(存在JMeter目录下的bin/jmeter.properties);其次他们可以被用来作为MemCache使用,以便线程间能够通信(Properties的get和put方法是线程安全的)。Property的获取、定义、修改一般是通过JMeter函数来完成的,当然也可以通过强大的BeanShell。

  通常当我们希望多个线程之间有某种依赖关系时可以使用Property,但是这样的需求并不多见,因为我们模拟的用户多半都是相互独立的,他们并不应该知道其他人在干什么。

  此外我们还可以将一些常量配置在jmeter.properties文件中,以便在测试中随时使用

  6. JMeter中的函数

  有的时候我们需要执行一些简单的操作(例如生成一个随机数)而又不希望编写BeanShell的Code,那么可以考虑使用JMeter中内置的一些函数。这些函数的格式通常为${__函数名(参数1,参数2...)},他们有两种方式来返回自己的执行结果:一种是直接返回,也就是说JMeter会在执行该函数后用函数的返回结果来替换原来调用函数的字符串(例如假设${__method(1,2)}返回world,那么如果我们在域中写hello ${__method(1,2)},则实际的结果是hello world)。另一种是通过参数(通常是最后一个)指定一个变量后,JMeter会将执行结果存入该变量。具体使用哪种方式获得结果是根据不同的函数而定的,JMeter提供了一个强大的函数生成器(Options菜单中的Function Helper Dialog选项),其中列出了所有的方法以及可能的函数,并且有方便的帮助文档,用户可以通过该生成器来生成所需的函数。

  这里有必要再次强调JMeter读入一个域(任何一个可以填写内容的空格)的过程:当JMeter读入一个域中的字符串后,会首先查看其中的是否存在能够匹配${...}的字符串,如果有则递归地解析这个${...}中的字符串,直到括号中的字符串不再包含括号为止。然后再解析这个${...}是否为一个函数或变量,如果是则用其结果覆盖原来的${...}字符串,直至将整个字符串解析完毕。例如在输入栏中输入hello ${__method(${num},2)},而num变量的值为1,则这个字符串首先被转化为hello ${__method(1,2)},然后由于${__method(1,2)}的值为world,则最终这个域中的内容为hello world。

  掌握了以上内容后基本就可以将JMeter中的函数和变量运用自入了,而读者所需做得事情只是查看手册了解那些函数能够提供何种功能。(注意有些函数是不能放入一些特殊的域中的,例如${__threadNum}就不能放在Test Plan的变量定义或者User Defined Element中的变量定义域中,具体原因手册上讲的很明白)

  7. JMeter中的BeanShell

  在多数情况下,JMeter提供的功能是不够我们使用的,我们的测试用例中可能会存在一些比较复杂的逻辑,而这些逻辑又不发通过简单的函数来实现,那么我们就必须动用强大的BeanShell了(JMeter有一些元素专门用于在测试的不同地方加入BeanShell脚本,如BeanShell Sampler)。不幸的是,JMeter的手册中并没有介绍BeanShell如何使用,而是把责任全部推给了BeanShell的网站,BeanShell的网站中的确有完整的BeanShell使用手册,但是我们总不希望为了做测试又去学习一个脚本语言,因此这里给出了一些BeanShell的简单应用,如果觉得不够的话再去查看更加复杂的应用。

  7.1 BeanShell快速上手

  BeanShell是面向Java的脚本语言,因此如果你想在完全不会BeanShell的前提下使用他,那么直接编写Java code就可以了。唯一需要注意的是,BeanShell支持若类型的变量,也就是不用指定变量类型,只要给他赋值就好了,BeanShell知道这个变量的类型。无论这个若类型变量在哪里被使用,其后的代码都能访问这个变量,这与强类型俄变量不同。例如:

  view plaincopy to clipboardprint?

  // Arbitrary code block

  {

  y = 2;      // Untyped variable assigned

  int x = 1;  // Typed variable assigned

  }

  print( y ); // 2

  print( x ); // Error! x is undefined.

  // Arbitrary code block

  {

  y = 2;      // Untyped variable assigned

  int x = 1;  // Typed variable assigned

  }

  print( y ); // 2

  print( x ); // Error! x is undefined.

  7.2 JMeter内置变量

  JMeter在它的BeanShell中内置了变量,用户可以通过这些变量与JMeter进行交互,其中主要的变量及其使用方法如下(JMeter文档并没有对该部分内容进行详细讲解,这里也会说明他们分别对应于JavaDoc中的哪个类):

  • vars:这个变量实际引用了JMeter线程中的局部变量容器(本质上是Map),因此可以通过put和get方法访问JMeter中的变量。这个变量是所有内置变量中最有用的,它是测试用例与BeanShell交互的桥梁。对应于org.apache.jmeter.threads.JMeterVariables
  • props:该变量引用了JMeter的配置信息,它的使用方法与vars类似,但是只能put进去String类型的值,而不能是一个对象。对应于java.util.Properties。
  • ctx:该变量引用了当前线程的上下文,理论上通过这个东西我们几乎可以控制当前线程相关的一切,不过这要求使用者非常熟悉JMeter的源码。对应于org.apache.jmeter.threads.JMeterContext。

  7.3 在BeanShell中使用Java类

  有的时候我们希望发送数个请求,而这些请求的内容是通过一个Java类来实现的,这时就需要让JMeter来调用这个Java类,而唯一的途径就是通过BeanShell。

  为了能够加载Java类,我们首先需要在Test Plan中添加自定义Java类所在的Class Path,然后就可以在BeanShell中import这个Java类,最后再将获得的内容放入vars变量中,这样就可以在其他地方通过${...}的方式获取该变量的信息了。

  例如,创建了一个com.linhao.A类在/root/Java文件夹下,该类有一个方法hello()返回一个"Hello World"字符串,那么如果想在请求中使用这个方法返回的字符串,则进行如下操作:

  首先在Test Plan下添加ClassPath为/root/Java

  然后在请求前添加一个BeanShell Sampler并写入如下代码:

  view plaincopy to clipboardprint?

  import com.linhao.A;

  vars.put("word", A.hello());

  import com.linhao.A;

  vars.put("word", A.hello());

  最后在需要使用该字符串的地方写${word},这样最终这个域将被替换为Hello World

  7.4 JMeter下BeanShell的调试

  BeanShell也是代码,应此也可能会有错误,而JMeter又是一个图形界面的程序(也有命令行模式,但并不变于在设计用例阶段使用),因此很多时候用例的设计者并不能确定BeanShell中某些变量是否正确。一个简单的办法是使用BeanShell创建一个对话框,然后将需要检测的变量值显示在对话框中。代码如下:

  view plaincopy to clipboardprint?

  JFrame frame = new JFrame( a ); //a is a variable to be checked

  frame.setVisible(true);

  JFrame frame = new JFrame( a ); //a is a variable to be checked

  frame.setVisible(true);

  这样当测试执行到这里的时候就可以知道变量a的值了。

  虽然BeanShell很强大,但是它毕竟是一个脚本语言,因此如果测试参数的生成逻辑很复杂,则还是应该把主要逻辑放在Java类中,然后让BeanShell去调用,BeanShell只用来处理一些较为简单的操作。

22/2<12
《2023软件测试行业现状调查报告》独家发布~

精彩评论

  • zeesun
    2012-1-17 17:01:38

    输入内容

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号