JMETER 测试webservice 接口

JMETER

JMETER简介

1.Apache JMeter是什么

Apache JMeter Apache组织的开放源代码项目,是一个100%Java桌面应用,用于压力测试和性能测量。它最初被设计用于Web应用测试但后来扩展到其它测试领域。Apache JMeter可以用于对静态的和动态的资源(文件,ServletPerl脚本,Java对象,数据库和查询,FTP服务器或是其它资源)的性能进行测试。JMeter可以用于在服务器,网络或对象模拟繁重的负载来测试它们提供服务的受压能力或者分析不同压力条件下的总体性能情况。你可以使用JMeter提供的图形化界面,分析性能指标或者在高负载情况下测试你的服务器/脚本/对象。

另外,JMeter 能够通过让你们用断言创造测试脚本来验证我们的应用程序是否返回了我们期望的结果,从而帮助我们回归测试我们的程序。为了最大的灵活性,JMeter 允许我们使用正则表达式创建断言。

 2.ApacheJMeter能做什么

1.能够对HTTPFTP服务器进行压力和性能测试,也可以对任何数据库进行同样的测试

2.完全的可移植性和100%Java

3.完全Swing的轻量级组件支持

4.完全多线程框架允许通过多个线程并发取样和通过单独的线程组对不同的功能同时取样

5.精心的GUI设计允许快速操作和更精确的计时

6.缓存和离线分析/回放测试结果

7.高可扩展性:

  • 可链接的取样器允许无限制的测试能力
  • 各种负载统计表和可链接的计时器可供选择
  • 数据分析和可视化插件提供了很好的可扩展性以及个性化
  • 具有提供动态输入到测试的功能
  • 支持脚本编程的取样器

JMETER的安装

JMETER下载地址:http://jakarta.apache.org/jmeter/usermanual/index.html

         JDK下载地址:http://www.oracle.com/technetwork/java/archive-139210.html

192.168.54.84 安装JDK1.7 以及 JMETER 3.0;下载时需要注意JMETER所需JDK版本

JDK安装及环境变量配置见如下网址:http://www.jb51.net/article/87701.htm

JMETER下载结束解压后找到bin目录下jmeter.bat运行即可

 

 

 

 

 

 

 

 

 

 

 

 

 

JMETER测试webservice接口

JMETER测试webservice接口测试配合SOAPUI来使用方便快捷。

SOAPUI作用主要来获取URL和DATA值,以便提写入到JMETER中:

打开SOAPUI建立项目点击需要测试接口如下图中1为URL、2为DATA值

 

方法1:

添加线程组,如下图:在测试计划右击添加

 

 

这个就是我们通常添加运行的线程。通俗的讲一个线程组,,可以看做一个虚拟用户组,线程组中的每个线程都可以理解为一个虚拟用户。线程组中包含的线程数量在测试执行过程中是不会发生改变的。Ramp-up Period 预留给线程的启动时间,如果设置线程数30,时间设置120则每个线程启动时间就是4s120/30),防止第一个线程执行结束最后一个还没启,达不到并发的效果;循环次数指单个线程即单个虚拟用户的循环次数。勾选调度器配置可以设置线程组的持续时间、延时等。

线程组下添加webservice取样器

 

 

把SOAPUI中刚刚获取的值复制进去,写入URL及DATA处。

 

参数化配置如下:先添加一个CSV Data Set Config

 

 

param.data的内容如下多个参数以逗号隔开,每行代表一组数据,与上图的变量名对应

 

在刚刚设置的DATA中,用刚设置参数名代替格式如下¥{userid}

 

添加测试结果监视,察看结果树和聚合报告

 

执行测试用例,两种方式均可以执行

 

察看结果树,可以看请求报文及响应报文内容

 

聚合报告

 

组合接口测试案例

在原来的线程组添加多个SOAP-Request,其中接口的顺序可以根据鼠标的拖拉来实现:

 

使用镜像服务器-调试发送的请求是否正确

添加HTTP Mirror Server的方式:

右键点击工作台”—>非测试元件—>HTTP Mirror Server

如果有必要的话需要修改端口号,点击启动按钮来启动Server 

接下来修改采样器,使其将HTTP请求 发送到localhost:8081(也就是Mirror Server启动的位置)

然后,运行测试计划,则可以从监听器查看结果树中看到响应数据。

JMETER关联

JMeter的关联方法有两种:后置处理器-正则表达式提取器与XPath Extractor

 

一、正则表达式提取器

1、添加正则表达式

在需要获得数据的上一个请求上右击添加一个后置处理器–>正则表达式提取器

解释

1)引用名称:下一个请求要引用的参数名称,如填写activityID,则可用${activityID}引用它。

2)正则表达式

()括起来的部分就是要提取的。

.匹配任何字符串。

+:一次或多次。

?:不要太贪婪,在找到第一个匹配项后停止。

注:(.+?)[.\n]+可以匹配换行符在内的所有字符。

3)模板:用$$引用起来,如果在正则表达式中有多个正则表达式(多个括号括起来的东东),则可以是$2$$3$等等,表示解析到的第几个值给title。如:$1$表示解析到的第1个值

4)匹配数字0代表随机取值,1代表全部取值,通常情况下填0,如果在LR中,取出的值是一个数组,还得处理一下,LR11版本用一个随机的函数就可以不用写大段的代码来处理数组。

5)缺省值:如果参数没有取得到值,那默认给一个值让它取。

 

2、关于正则表达式的举例说明

1)提取单个字符串:

假设测试人员期望匹配Web页面的如下部分:name = “file” value =“readme.txt”>并提取readme.txt

一个符合要求的正则表达式:name = “file” value =“(.+?)”>

():封装了待返回的匹配字符串。

.:匹配任何字符串。

+:一次或多次。

?:不要太贪婪,在找到第一个匹配项后停止。

2)提取多个字符串:

假设测试人员期望匹配Web页面的如下部分:name = “file” value =“readme.txt”>并提取filereadme.txt

一个符合要求的正则表达式:name = “(.+?)”value = “(.+?)”

引用名称:MYREF

模板:$1$$2$

如下变量的值将会被设定:

MYREF_g0:name =“file”value = “readme.txt”

MYREF_g1:file

MYREF_g2:readme.txt

引用${MYREF_g1}

 

3、使用该关联的请求

如下图:

 

二、XPathExtractor

XPath Extractor是另一个可被用来提取页面给定内容的PostProcessorXPathExtractor的使用方式与RegularExpression Extractor类似,只不过需要在该Extractor中指定的不是正则表达式,而是给定的XPath路径。

xpath从前一个请求中取。这种形式比较适合于返回为xml片段的情况。在需要获得数据的请求上右击添加一个后置处理器–>xPathExtractor。引用名称即下一个请求要引用的参数名称,如填写body,则可用${body}引用它。

Xpath一般用于返回xml用得多。

XPath Extractor的设置界面:

l  Use Tidy?:当需要处理的页面是HTML格式时,必须选中该选项,当需要处理的页面是XMLXHTML格式(例如,RSS返回)时,取消选中该选项。

l  Reference Name:存放提取出的值的参数。

l  XPath Query:用于提取值的XPath表达式。

l  Default Value:参数的默认值。

 

三、小结这两种方式

正则表达式提取器和XPathExtractor都可以用来提取给定页面中的特定文本,并将其保存在参数中,这两种方式各有优缺点。

正则表达式提取器可以用于对页面任何文本的提取,提取的内容是根据正则表达式在页面内容中进行文本匹配;

XPathExtractor则可以提取返回页面任意元素的任意属性。

相比较而言,

如果需要提取的文本是页面上某元素的属性值,建议使用XPath Extractor;

而如果需要提取的文本在页面上的位置不固定,或者不是元素的属性,建议使用正则表达式提取器。

 

JMETER逻辑控制器

JMeter中的Logic Controller用于为Test Plan中的节点添加逻辑控制器。

JMeter中的Logic Controller分为两类:一类用来控制Test Plan执行过程中节点的逻辑执行顺序,如:Loop ControllerIf Controller等;另一类则与节点逻辑执行顺序无关,用于对Test Plan中的脚本进行分组、方便JMeter统计执行结果以及进行脚本的运行时控制等,如:Throughput ControllerTransaction Controller

 

一、控制Test Plan中的节点执行顺序的Logic Controller

1ForEachController:类似于编程语言中的for each语句。如下图:

通常情况下,ForEach Controller常与Regular Expression Extractor配合使用。

 

2If Controller:类似于编程语言中的if语句,根据给定表达式的值决定是否执行该节点下的子节点。如下图:

注意:条件判断语句如果是字符串一点要在参数前加引号,如:a.”${foreach_city}”==”beijing”b.”${foreach_city}”!=”beijing”

如果选中“Evaluate for all Children”选项,则该Controller在每个子节点执行时执行一次,否则,该Controller仅在入口执行一次。

 

3InterleaveController:在每次迭代时,顺序选取该节点下的一个子节点执行。如下图:

如果选中“Ignore sub-controller blocks”选项,则该Controller将其下的子Controller当成单一元素处理,并仅允许每个子Controller一次发出一个请求。

在该示例中,设置迭代次数为4次,节点的执行顺序是:Req1-HTTP Request –Req2—HTTP Request—Req3—HTTP Request.

 

4Loop Controller:简单地为其下的子节点运行指定次数。如下图:

 

5Once OnlyController:是为了让Test Plan中的某些内容在整个Test Plan的执行期间对每个线程仅执行一次(例如,每个线程仅需要执行一次登录操作)。如:将Once Only Controller作为Loop Controller的子节点,Once OnlyController在每次循环的第一次迭代时均会被执行。如下图:

 

6RandomController:每次执行时,从其子节点中随机选取一个来执行。如下图:

 

7Random OrderController:每次执行时,按照随机产生的顺序执行其下的所有子节点。注意,该ControllerRandomController的不同之处在于,RandomController只选择执行其所有子节点中的一个,而Random Order Controller则按照随机顺序全部执行该Controller下的所有子节点。

 

8SwitchController:类似程序语言中的switch函数,该Controller根据给定的值n(可以使用参数)选择执行其下的第n+1个子节点。如下图:

需要注意的是,Switch Controller只接受整数值,并且给定的值n是以0为基础的,因此当给定的值“2”时,意味着该Controller下的第3个子节点会被执行。同时,Switch Controller接受参数作为其值。

 

9While Controller:是另一个用于控制循环的Controller。可以为该Controller设置一个Condition.Condition的取值可以为以下三者之一:

空:如果Condition取值为空,则该Condition迭代执行Controller下的所有子节点,直到最后一个子节点返回失败为止。需要注意的是,如果不是最后一个子节点失败,而是该Controller中的其他子节点失败,该Controller不会停止,而会继续循环执行过程。

LAST:如果Condition取值为字符串LAST,则该Controller迭代执行Controller下的所有子节点,直到最后一个子节点返回失败为止(与Controller为空时的行为相同)。同时,如果该Controller的上一个节点失败,则Test Plan在执行时不会进入该Controlller

表达式:除了为空和LAST外,Controller还可以取一个表达式。当Controller取值为表达式时,如果表达式的取值是字符串falseWhile Controller就退出循环。以下列出了几个可用的表达式:

${VAR}:当参数VAR的值被设置成false时退出循环。

${__javascript(“${VAR}”==”dennis”)}:当参数VAR的值不为dennis时退出循环。

${_P(myproperty)}:当属性myproperty的取值为false时退出循环。

 

二、其它Logic Controller

除了以上的9Logic Controller外,JMeter还支持其他7Logic Controller.

1IncludeController:用于在Test Plan中包含一个外部的jmx文件。

Test Plan运行时,被包含的jmx文件中测试计划中不能有线程组,只允许有一个Simple Controller和该SimpleController下的子节点(可添加任何采样器,控制器),不允许有Cookie ManagerUser DefinedVariable等。

如果用户需要使用Cookie Manager或者 用户自定义变量,都应该在顶层的测试计划中设置,不应该包含在外部文件中,否则不会它们不会起作用。

注意:被包含文件中的Simple Controller及其子节点将会替换Test Plan中的Include Controller.

 

外部jmx文件结构图:

主测试计划图:

 

 

2SimpleController:如同该Controller的名称,是JMeter中最简单的一个Controller。该Controller仅用于对Test Plan中的元件进行分组,不具有任何的逻辑控制或运行时的功能。

 

3ModuleController:为Test Plan提供了在运行时动态执行给定的Test Plan片段的能力。如下图:

从图中可以看出,无论是放在本Thread Group、其他的Thread Group,或是WorkBench下的Test Plan片段,都可以在Module Controller中被调用。

 

4RuntimeController:用于指定其子节点的运行时长。该Controller中指定的时间以秒为单位,仅对该Controller的子节点有效。

 

5ThroughputController:用于控制其下的子节点的执行次数与负载比例分配的。

Throughput Controller允许用户使用两种模式控制其下子节点的执行顺序:比例模式和总数模式。总数模式指定该Controller下所有子节点的准确迭代次数,而比例模式允许负载在Controller下的子节点以某种比例进行分配。在比例模式下,设定的Throughput值为一个0-100之间的整数,表示该Controller迭代次数占总迭代次数的百分比。

可能你已经意识到,如果要在一个Test Plan中体现用户场景,Throughput Controller应该是最合适的选择。

A给出了总数模式下的Throughput Controller,在这种模式下,每个线程最多运行Java Request10次(具体的运行次数还取决于线程组中线程数和迭代次数的设置,如果设定的Total Execution的次数大于线程组中设置的迭代次数,每个线程最多运行线程组中设定的迭代次数)。

B给出了比例模式下的Throughput Controller,从图中可以看出,该Test Plan包含了两个ThroughputController,第一个设定的Percentage70,也就是70%,第二个设定的Percentage30,也就是30%。线程组的线程数设置为10,迭代次数也设置为10.在这种模式下,req1被运行70次,req2被运行30次。如下图:

 

6TransactionController:用于将Test Plan中的特定部分组织成一个TransactionJMeterTransaction的作用在于,可以针对Transaction统计其响应时间、吞吐量等。

在有些情况下,一个用户操作可能需要多个Sampler来模拟,此时,使用Transaction Controller,可以更准确地得到该用户操作的性能指标,如响应时间等。

 

7RecordingController:唯一的用途是用于存放JMeter录制得到的脚本。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值