Jmeter使用

来源:互联网 发布:淘宝联盟是不是真的 编辑:程序博客网 时间:2024/05/18 00:03

JMeter主要是一个用于load/stress test的工具。由于它具有一套专门的术语和概念,对于我等不是专门做测试的人员来说初次使用它时确实有点无从下手的感觉。只有搞清楚了它的几个基本概念,用起来才能做到心中有数。虽然JMeter的用户文档讲得很详细,但是那里毕竟没有结合JMeter所有概念讲一个综合应用的例子(实际测试中的Test Plan往往需要综合运用很多概念的),不失为一个小小的遗憾。 本文结合一个webapplication测试的例子介绍JMeter的完整概念。

 

JMeter使用的概念有:Thread,Sampler,LogicController, Config Element(配置元素),Timer,Pre-/Post Processor,Assertions, Listener。

 

从整体结构上来讲,首先一个测试就是一个Test Plan(测试计划),每一个Test Plan可以设定Thread Group,Thread Group下面的树形结构就是下面设置的测试配置信息。

下面是本实例的一个整体配置:

(图1)

 

一个Thread模拟单个测试用户,例如下面的是ThreadGroup元素中的配置信息,它表示模拟100个用户的访问,ramp-up表示100个用户线程5秒钟之内才能全部启动完成。

(图2)

 

*****Sampler是核心概念:

要通过http访问web server,免不了需要使用Sampler(对于这里的Web测试是HttpRequest Sampler)。所谓Sampler就是对Server的访问,相当于浏览器(但是不解析html/css和JavaScript),每一次访问请求得到的响应在JMeter中作为一个Sample保存并通过Listener让用户察看HTTP response的结果和统计图表。所以Sampler是JMeter的核心概念。其他的概念都是围绕着Sampler服务的,比如Pre-processor(预处理器)可以在Sampler向Server发送请求之前定义一些变量或做处理(比如本例图1中的User Parameters);而Post-Processor可以在得到Response之后作一些操作(比如本例图1中的“RegEx extractor - tableuseid”)。图1中包括的Sampler有四个:

1) Login.action(在Once Only Controller下面)

2) Main.action (位于Simple Controller下面)

3) Click Table(afterSelectTable_ajax.action) (位于SimpleController下面)

4) CreateOrder(doOpenGuestTable_ajax.action) (位于SimpleController下面)

 

下面围绕着以上四个samplers介绍JMeter的其他概念。

 

*****如何设置多个HTTP Requests的缺省值:

首先在测试一个web application的时候,每个Sampler都需要设定web server的主机IP地址等信息,而这些信息在每个Sampler中是相同的,因此可以通过一个Config Element—Http Request Defaults将这些共同信息(比如Web Server主机IP)提取出来保存,然后在上面四个Samplers中就不需要再设置了。

(图3)

 

*****Once Only Controller:

Login.action是web程序的login功能,每一个用户(Thread)都需要单独login,但是在一个用户的所有HTTP requests中(即一个session)只需要login一次。因此如果可以将这个Sampler放到Once Only Controller下面,保证login只在一个session中执行一次。Once Only Controller是JMeter中的另一个概念--Logic Controller。Logic Controller类似于编程语言中的for循环那样的控制结构,它可以控制树形结构下面包含的Samplers的执行方式。常用的Logic Controller有Simple Controller(就是一个简单的容器,将树形结构下面的Samplers放到一起,见图1), 这里的Once Only Controller,还有Interleave Controller(上一次执行下面的一个某个Sampler A,下一次执行下面的一个某个Sampler B)等。

下图是Login.action这个Sampler的设置:

(图4)

 

*****Sampler中每一个用户可以有不同的URL参数值:

从上图中可以看到在调用login.action的URL参数中使用了一个参数funcType,它的值是从另外一个变量${FUNCTYPE}中读取的。那么FUNCTYPE变量在那里定义的呢?答案是User Parameters中定义了该变量。前面说过,User Parameters是一个Pre-processor,只在Sampler执行之前使用该元素,所以在执行Login.action之前,其中一个变量FUNCTYPE可以从User Parameters中设置。在本例中,我们模拟了100个用户,希望每一个用户可以从funcType的两个值{1,2}中依次选一个,因此User Parameters的作用就是在每个Sampler执行之前,给它设置一个funcType值,每一个funcType变量可以设定多个用户,比如本例中设置了user1和user2,但是实际上测试用户数是100,这种情况下就轮流从user1和user2中选取(比如用户3使用user1的值,用户4使用user2的值,用户5使用user1的值)。

下图是本例中UserParameters的设置:


(图5)

 

*****Cookie管理:

几乎所有的Web Application都需要cookie管理,JMeter可以模拟浏览器的做法管理cookie,只需要添加一个Config Element – HTTP Cookie Manager(如上图所示)。

 

*****如何定义变量:

另外在Simpler Controller下面有一个UserDefined Variables,它也是一个Config Element。在本例中,由于其中一个Sampler “ClickTable(afterSelectTable_ajax.action)”需要一个参数tableId作为输入,但是又不希望把这个参数值hard code进去,因此设置一个用户定义的变量TABLEID(注意图中变量的作用域是Simpler Controller下的三个Samplers,但是只有Main.action中用到该变量):

(图6)

 

*****如何在Http Request Sampler中使用变量:

然后在Sampler “Click Table(afterSelectTable_ajax.action)”中可以按${TABLEID}的方式引用这个变量:

(图7)

 

*****Regular Expression Extractor提取Http Response信息并保存成变量:

除了上面使用User Defined Variables的方法定义变量之外,本例中还是用了Regular Expression Extractor从HTTP response的输出结果中获取一个字符串作为一个变量。Regular Expression Extractor是JMeter中的另一个概念—Post-processor,它的作用是得到HTTP响应后,对结果(比如一个html标签页面的内容或json输出数据等)进行处理,通过regular expression抽取字符值,存成一个变量给后面的Sampler使用。

例如在Click Table(afterSelectTable_ajax.action)这个Sampler执行完一次HTTP Request之后得到如下的HTTP Response(一个json格式的输出):

 

{"free":false,"hasError":false,"singleEntry":true,"table_nr":"05","tableid":5,"tableuseid":130}

 

现在要得到tableuseid的值130,可以用这样一个regular expression:

^.+?"tableuseid":([^} ,]+).*$

上面括号中的内容就是提取130的值,用括号的作用是可以把该值作为一个组,并存成一个变量以便在下一个Sampler--CreateOrder(doOpenGuestTable_ajax.action)中使用。

注:可以用下面的perl命令行交互式测试正则表达式:
perl -n -e '/^.+?"tableuseid":([^} ,]+).*$/ && print "$1\n"' 


(图8)

 

*****在另一个Sampler中使用RegEx提取的变量:

按照上图的设置,在CreateOrder(doOpenGuestTable_ajax.action)中如何引用该变量呢?根据JMeter的用户参考文档,应该是${tableuse_g1}。

下图是该变量在Sampler--CreateOrder(doOpenGuestTable_ajax.action)中的使用。

(图9)

 

 

*****JMeter的函数:

在上图中,还有一个URL参数nocache,它使用一个函数${__time}获取client中的当前时间。

 

*****Timer:

在上图的Sampler--CreateOrder(doOpenGuestTable_ajax.action)下面有一个constant timer--delay executing CreateOrder,它的作用是在执行完上一个Sampler(这里的Click Table)之后,延时一个时间段,这样不至于给服务器造成过多的影响。

 

*****HTTP Response的html内容校验:

在CreateOrder(doOpenGuestTable_ajax.action)的HTTP响应(一个html标签页面的内容)中,我们需要检测是否包含一个单词“Beer”,如果没有这个单词,说明HTTP响应出错。这就是自动化的功能测试的思想。可以使用JMeter的另外一个概念—Assertion完成这项工作,本例中使用ResponseAssertion,如下图所示:

(图10)

 

*****测试结果的显示:

测试结果可以输出每一个Sample的HTTP Request/Response的内容,也可以用图表统计所有的Samples,并保存到文件中。在JMeter中使用Listener这个概念,Listener的作用就在每个Sample执行之后根据设置做相应的统计处理。本例中使用到的Listener有两个:View Results Tree和Graph Results。

  

参考图1(为方便起见,重新贴在下面),总结一下本例Test Plan中用的元素和它们在JMeter中的概念对应关系:

 

1. Thread: 模拟一个用户

2. Sampler:

1) Login.action(在Once Only Controller下面)

2) Main.action (位于Simple Controller下面)

3) Click Table(afterSelectTable_ajax.action) (位于SimpleController下面)

4) CreateOrder(doOpenGuestTable_ajax.action) (位于SimpleController下面)

 

3. Logic Controller:Once Only Controller和SimpleController
4. Config Element: HTTP Request Defaults, HTTP Cookie Manager和User DefinedVariables

5. Timer: delay executing CreateOrder

6. Pre-Processor:User Parameters

7. Post-Processor:RegEx extractor - tableuseid

8. Assertions: Response Assertion

9. Listener: View Results Tree和Graph Results

总结:以上介绍的是JMeter的核心概念,JMeter还有很多其他功能,比如分布式测试(在一台机器上测试受单机的性能限制,往往压力测试结果不能反映真实情况),无图形界面(non-GUID)的测试等等。但是掌握了这些核心的概念,已经可以自如地应对普通的测试方案了。

原创粉丝点击