技术开发 频道

基于JMeter对J2EE应用程序进行性能测试

【IT168 技术文章】

  JMeter是apache的jakarta上面的项目,用于软件的压力测试(Load Test),不但可以对HTTP,也可以对数据库(通过JDBC)、FTP、Web Service、Java 对象等等进行压力测试。最近,在我们的项目中使用到了它。我们的项目是基于BEA Weblogic的一个J2EE项目,在一个Domain中部署了3个J2EE应用,这样在客户使用的过程中出现了WebLogic内存垃圾回收的问题。于是我们配置了WebLogic集群,并将其中的某些应用分开部署,并使用了JMeter进行了性能测试。从而为应用程序的性能诊断提供了必要的依据。

    基本概念

  JMeter的测试计划(Test Plan)呈树状结构,树里面有多种元素类型,树状结构的元素之间有的是有继承关系的(其原理有点类似log4j)。下面简述一下元素类型:

    1、ThreadGroup
  顾名思义就是线程组,测试必须有一个ThreadGroup元素作为基础(否则就没有测试线程在跑了),这个元素可以配置跑多少个线程、每个线程循环多少次,所有线程数的总启动时间(Ramp-up period)等等。

    2、Controller
  包括Logical Controller和Sampler,前者用来作一些逻辑上的控制,例如轮换、条件、循环等等。Sampler就是真正“干活”的“取样器”,例如“HTTP Request”,就是拿来执行一个HTTP请求的。

    3、Listener
  Listener对请求过程进行监听,可以简单理解为获取结果的东东。例如Simple Data Writer,可以把结果写到一个文本文件里(其实所有Listener都可以写数据到文件里),还有View Results in Table,就是把结果显示在表格里。

    4、 Timer
  用来控制执行流程中的时间延迟等功能。

    5、 Assertion
  断言,加到Sampler里面可以对返回的结果进行判断,例如判断HTTP返回结果里面是否含有某个字符串。如果断言为真,JMeter会标记请求为成功,否则标记为失败。

    6、 Configuration Element
  配置用的元素,很有用。由于测试计划是树状和有继承关系的,可以在高层次指定一个Configuration Element,低层次的相关Sampler如果没有显式地指定配置,就继承高层次的配置信息。(跟log4j很像吧?)

    7、 Pre-Processor/Post-Processor Elements
  用来在Sampler运行前和运行后作一些预处理和后处理工作的。例如动态修改请求的参数(预处理),从返回信息里面提取信息(后处理)等等。


  要提醒一下的是jmeter根据当前系统的locale显示菜单的语言,为了方便想设置回英文的话,可以修改jmeter.properties文件,设置language=en

    JMeter的使用


    #启动

  大家可以到通过http://apache.linuxforum.net/dist/jakarta/jmeter/binaries/jakarta-jmeter-1.9.1.zip下载JMeter的release版本,然后将下载的.zip文件解压缩到C:/JMeter(后面的文章中将使用%JMeter%来引用这个目录)目录下。现在,请使用%JMeter%/bin下面的jmeter.bat批处理文件来启动JMeter的可视化界面,下面的工作都将在这个可视化界面界面上进行操作。下面的图片是JMeter的可视化界面的屏幕截图。

     

    图一: JMeter打开时的屏幕截图?

    # 建立测试计划(Test Plan)

  测试计划描述了执行测试过程中JMeter的执行过程和步骤,一个完整的测试计划包括一个或者多个线程组(Thread Groups)、逻辑控制(Logic Controller)、实例产生控制器(Sample Generating Controllers)、侦听器(Listener)、定时器(Timer)、比较(Assertions)、配置元素(Config Elements)。打开JMeter时,它已经建立一个默认的测试计划,一个JMeter应用的实例只能建立或者打开一个测试计划。现在我们开始填充一个测试计划的内容,这个测试计划向一个jsp文件和一个servlet发出请求,我们需要JMeter模拟五个请求者(也就是五个线程),每个请求者连续请求两次,下面的章节介绍了详细的操作步骤。

    # 增加负载信息设置

  这一步,我们将向测试计划中增加相关负载设置,是Jmeter知道我们需要模拟五个请求者,每个请求者在测试过程中连续请求两次。详细步骤如下:

    1. 选中可视化界面中左边树的Test Plan节点,单击右键,选择Add'Thread Group,界面右边将会出现他的设置信息框。

    2. Thread Group有三个和负载信息相关的参数:

    Number of Threads: 设置发送请求的用户数目

    Ramp-up period: 每个请求发生的总时间间隔,单位是秒。比如你的请求数目是5,而这个参数是10,那么每个请求之间的间隔就是10/5,也就是2秒

    Loop Count: 请求发生的重复次数,如果选择后面的forever(默认),那么 请求将一直继续,如果不选择forever,而在输入框中输入数字,那么请求将重复 指定的次数,如果输入0,那么请求将执行一次。

  根据我们演示例子的设计,我们应该将Number of Threads设置为5,Ramp-up period设置为0(也就是同时并发请求),不选中forever,在Loop Count后面的输入框中输入2,设置后的屏幕截图如下:

     

    图二:设置好参数的Thread Group。

    # 增加默认Http属性(可选)

  实际的测试工作往往是针对同一个服务器上Web应用展开的,所以Jmeter提供了这样一种设置, 在默认Http属性设置需要被测试服务器的相关属性,以后的http请求设置中就可以忽略这些相同参数的设置,减少设置参数录入的时间。我们这里将采用这种属性。你可以通过下面的步骤来设置默认http属性:

    1. 选中可视化界面中左边树的Test Plan节点,单击右键,选择Add'config element'http request defaults,界面右边将会出现他的设置信息框。

    2. 默认http属性的主要参数说明如下:

    protocal:发送测试请求时使用的协议

    server name or ip:被测试服务器的ip地址或者名字

    path: 默认的起始位置。比如将path设置为/jmeter,那么所有的http请求的url中都将增加/jmeter路径。

    port number: 服务器提供服务的端口号

  我们的测试计划将针对本机的Web服务器上的Web应用进行测试,所以protocal应该是http,ip使用localhost,因为这个web应用发布的context路径是/jmeter,所以这里的path设置为/jmeter,因为使用Tomcat服务器,所以port number是8080。 

0
相关文章