jmeter 测试计划里的元件


原文

Jmeter用户手册

在介绍测试计划中元件之前,先了解下Jmeter中工作台,我们可以在工作台中配置HTTP代理服务器,然后将录制的脚本存入工作台中,进行初步编辑,然后将脚本复制/粘贴到测试计划中。

什么是测试计划呢?测试计划在软件测试项目中是用于管理一个软件项目的测试资源配置,时间表以及测试用例等。一般测试计划中也包括风险评估,计划开始和结 束的条件等。 而JMeter中的测试计划,实际上是一个或一组测试用例。可以将线程组(Thread Group)理解为一个测试用例,在一个测试计划中可以有多个测试线程组。它是其它 JMeter 测试元件的容器。 最简单的测试计划包括:线程组、取样器、监听器等。

1. 线程组

线程组是任何一个测试计划的开始点。所有的控制器和取样器肯定在某个线程组下,其它的配置元件,如:监听器,可能会被直接放到测试计划目录下。顾名思义,线程组元件控制JMeter执行你的测试计划时候使用的线程数量。右键点击测试计划,选择添加,在弹出的菜单中,选择线程组,则会添加一个线程组。如下图所示:

对线程组的操作允许你:

(1) 设置线程组名称、注释。

(2) 在取样器错误后要执行的动作

   *  继续。表示某个线程错误后,后面的线程继续运行。

   *  停止进程。表示停止当前进行的进程,返回出错之前的测试结果。

   *  停止测试。表示完成停止测试,便于进行错误原因的查看。

   *  Stop Test Now。表示立即停止测试。

(3) 设置线程数(Number of Threads)表示同时运行多少个线程,发送多少个请求。代表一定数量的并发用户,用来模拟并发用户发送的请求,实际的请求内容在取样器(Sample)中定义,它被线程组包含。

(4) 设置ramp-up period。

ramp-up period 表示Jmeter用于创建全部选择的线程的时间。如果选择了10个线程,并且ramp-up period 是100秒,那么JMeter用100秒使10个线程启动并运行。每个线程将在前一个线程启动后10(100/10)秒后启动。如果将此设置为0,则表示并发,也就是所有线程在统一时间启动。Ramp-up需要足够长的时间来避免在开始测试时产生太大的负荷,并且有足够短的时间使最后一个线程在第一个线程结束之前运行。(除非你想那样做)

(5) 设置循环次数: 表示请求的重复次数,如果选择永远(forever),请求将永远执行下去。

(6) 调度器

在1.9以后的版本中多了调度器这个功能,通过这个功能,你可以设置什么时候开始测试,什么时候结束测试,如果你设置了开始测试时间,就算是你在Jmeter上运行了测试,如果没有到你设置的开始时间,jmeter是不会执行测试的,直到到了你设置的开始时间,才会开始执行测试,同样的,如果你设置了结束时间,一旦到了结束时间,不管当前执行的循环有没有结束,jmeter都 会停止执行。而启动延迟与开始时间差不多,你可以设置开始测试时多长时间才开始真正执行测试,而持续时间,则设置当前线程组总共执行多长时间,注意启动延 迟会覆盖启动时间,持续时间会覆盖结束时间。通过调度器的设置,你可以更加灵活的对你的测试计划进行设置,使得测试计划可以符合更复杂的场景。

2. 控制器

Jmeter有两种类型的控制器:取样器和逻辑控制器。

取样器

指示JMeter向一个服务器发送请求。例如,如果你想让JMeter发送HTTP请求,那么添加一个HTTP请求器,添加方法为右键点击线程组,选择添加,在弹出的菜单中,选择samper,然后选择http请求。你可以向一个取样器中添加一个或多个配置元件来定制请求。

Jmeter有 多个取样器可以使用,包括:FTP请求,HTTP请求,JDBC请求,Java object请求,LDAP请求,SOAP/XML-RPC请求,Web服务(SOAP)请求。每种取样器表示一种请求,每个取样器有几个可以设置的属 性。你可以向取样器添加一个或多个配置元件来进一步的控制取样器,比如添加断言,添加监听器等。如果你在一个线程组中添加了多个取样器,JMeter以你在树中添加取样器的顺序发送请求。

如果你想向一个服务器发送同种类型(例如:HTTP请求)的多个请求。考虑使用缺省配置元件(Defaults Configuration Element)。每个控制器有一个或多个缺省元件。

逻辑控制器

逻辑控制器可以让你自定义逻辑控制,以便Jmeter决定何时发送请求。它们能够改变一些请求的顺序,这些请求来自这些控制器的子元件。它们也可以修改请求本身,导致Jmeter重复请求,等。

要理解逻辑控制器对测试计划的影响,假设如下的测试树:

个人理解:这里的仅一次控制器是搭配线程组中的循环次数来用的,如果是在线程组里面设置线程数的话,设置多少次,仅一次控制器控制的取样器还是会发我少次请求,但是如果是线程组里面的循环次数来控制或是逻辑控制器里面的循环控制器来控制的话,仅一次控制器就会发生作用,只用执行一次。而线程组里面的循环是起新的请求,它的cookie什么的都会丢失,而逻辑控制器里面的循环是根据上一次循环的结果来的,上一次的cookie对它来说还是有用的,它会在上一个页面的基础上运行.
还有这里的线程组里面的循环次数控制是在每发送完一个请求加载结束之后循环一次,这里的循环取值是根据文件里面顺序来取跟起多个线程数来取值是一样的效果,但是逻辑控制器里面的循环控制器的取值就不一样了,它取的是这些循环里面的第一次的值,也就是它的取值会不变

这个测试首先是执行登录请求,它在整个测试过程中只执行一次。后面的反复执行将跳过它。这是由于使用了仅一次控制器。登录后,取样器接着会加载搜索页(想像一个用户登录进去,然后打开搜索页来搜索信息这样一个WEB应用。)这只是一个简单的取样器请求,没有用任何逻辑控制器过滤。加载完搜索页后,我们想搜索一下,事实上,我们想做两种不同的搜索。然而,我们想在每个搜索之间重新加载搜索页面。我们可以通过使用四个简单的HTTP请求元件(加载搜索页面,搜索‘A’,加载搜索页面,搜索‘B’)。或者使用交替控制器,它一次传递一个子请求到这个测试。按子元件的排列顺序。交替2个子请求可能有点大材小用,但是如果有8或是20个子请求,那么它使用它将很简单。

注意HTTP默任请求是在交替控制器里。设想一下,“搜索A”和“搜索B”共享相同的目录信息(一个规范的HTTP请求包括域,端口,方法,协议,路经,参数和一些其它可选选项)两个搜索请求,都使用相同的后台搜索引擎(我们可以暂说它是一个servlet或是cgi脚本)。与其配置两个使用相同路经信息的HTTP取样器,不如我们能够把信息提取到单独的一个配置元件。当交替控制器把请求从“搜索A”传递到“搜索B”时,它会把HTTP默任请求配置元件值填在空白值里。因此我们把那些请求的路经信息置空,把那些信息放在配置元件里。在这个例子里,这至多是一个很小的好处,但它显示了这个特性。

这个树的下一个元件是另一个HTTP默任请求,这次单独把它放在线程组里。线程组有一个内置的逻辑控制器,因些,它可以向上面说的那样,精确的使用配置元件。它会填上空白处来传递任何一个请求。它在网站测试时,置空你所有的HTTP取样器的域值,把那些信息放在HTTP默任请求元件里,然后加到线程组时特别有用。通过这样做,你可以在不同的服务器上通过简单的改变你的测试计划里的一个值来测试你的应用。否则,你不得不在每个取样器,每个值修改一次。

最后一个元件是HTTP Cookie管理器。你因该在所有的网站测试里添加一个Cookie管理器,否则JMeter会忽略Cookie。通过添加它到线程组这一层,我们可以确保所有的HTTP请求可以共享相同的Cookie。典型的 web 应用一般都会:(1)有一个登录页,它是整个应用的入口。当用户登录之后,应用会将用户相关的安全信息放到 session 中。(2)有一个 filter,它拦截请求,检查每个请求相关的 session 中是否包含有用户安全信息。如果没有,那么请求被重定向到登录页,要求用户提供安全信息。如果你不添加Cookie管理器,在这种配置下应用上面的测试计划,那么除了登录页之外的其它请求都将因为缺少用户安全信息,而使请求实际定位到登录页。如果不加断言,那么在监听器看来所有的请求都是成功。而实际上,这些请求最终都没有到达它们应该去的地方。显然,这种测试结果不是我们所期望的。

Jmeter还有其他一些逻辑控制器,你可以添加多个逻辑控制器来达到各种不同的结果。

3. 监听器

当JMeter运行时,监听器可以提供访问JMeter所收集的关于测试用例的信息。图像结果监听器在一个图表里绘制响应时间。查看结果树监听器具体的显示取样器的请求和响应,然后以HTML和XML格式显示出来。其它的监听器提供汇总或组合信息。

此外,监听器可以把所有数据写入一个文件,为日后使用。在JMeter里的每个监听器都可以指定一个文件,用来存储数据,扩展名为jtl。也有一个Configuration按钮,用来选择保存为哪有文件,是否使用CVS or XML格式。注意:所有监听器都是保存相同的数据,仅仅不同的是数据呈现在屏幕上的方式不同。

可以在测试中任何地方添加监听器,包括直接在测试计划目录下。它们只会收集从这个元件开始or下级元件的数据。 一 个监听器会耗费相当多的内存,如果它关联多少个采集器。JMeter会变慢,如果你选择激活多个监听器。因此尽量选择合适的监听器来使用。个减少内存占用 的方法是用CSV默认的格式来保存数据,并且使用Simple data Writer监听器。你可以改变默认的格式为xml,通过编辑jmeter.properties。将 jmeter.save.saveservice.output_format=csv,改为xml即可。

4. 计时器(Timers)

计时器,通俗讲就是在Jmeter中设置两个请求之间的延时,用来模拟思考时间(Think time)。计时器在线程产生每个请求前启动。默认的,JMeter线程在每个请求之间不停顿地发送请求。我们建议你通过添加一个可用的计时器来给你的线程组指定一个延迟。如果你不添加延迟,JMeter会通过在很短的时间内发送过多的请求来压垮你的服务器。

计时器会使JMeter在一个线程制造请求前延迟一个确定数量的时间。如果你选择给一个线程组添加超过一个计时器,JMeter会在执行它们申请的取样器之前计算计时器的总和作为延迟时间。

5. 断言(Assertions)

断言允许你判断从测试服务器返回的结果。使用断言,你可以从根本上测试你的应用程序是否正在返回你所期待的结果。例如,你能断言一个查询的响应中含有某些特殊的文本。你指定的文本可以是一个Perl类型的正则表达式,并且你能指定响应包含这段文本,还是它应该匹配整个响应。你可以对任意的取样器添加一个断言。例如,你可以给一个HTTP请求添加一个断言检查正文,”</HTML>”。JMeter然后会在这个HTTP响应中检查这段正文,如果JMeter找不到这段正文,它会把这次请求标识成一个失败的请求。为查看断言的结果,在线程组中添加一个断言监听器。失败的断言会在树形和表格监听器中出现,并且会计算错误的百分比(例如在聚合报告和简报中)。

通俗讲,断言相当于一个测试用例中某个测试步骤的预期结果,如果取样器返回的实际结果与你断言的预期结果不一致的话,在结果观察树里会显示红色,在测试报告里会显示 false。

6. 配置元件(Configuration Elements)

配置元件的工作和取样器紧密相联。尽管它不发送请求(HTTP Proxy Server除外),但它可以添加或修改请求。配置元件只对你放置该元件的树形分支产生作用。例如,如果你把一个HTTP Cookie管理器放到一个简单逻辑控制器下面,这个Cookie管理器只会对你放置到简单逻辑控制器里面的HTTP请求控制器产生作用。如下图所示:

图中的HTTPCookie管理器对HTTP请求”Web Page 1”和”Web Page 2”起作用,但是对”Web Page 3”不起作用。并 且,在树形分支下里的配置元件比一个”父”分支下的相同配置元件有更高的优先级。例如,我们定义两个HTTP默认请求元件,"Web Defaults 1" 和 "Web Defaults 2".因为我们把"Web Defaults 1"放到一个循环控制器里,只有”Web Page 2”能用它。其它的HTTP请求会使用”Web Defults 2”,因为我们把它放到线程组下(其他所有分支的”父”)。

7. 前置处理器(Pre-Processor)

   前置处理器在取样器请求发出前执行一些动作。如果一个前置处理器附加到一个请求元件,那它会在那个请求元件启动前先执行。一个前置处理器最经常被使用于 在取样器运行前修改取样器请求的设置,或者更新那些不是从响应文本中提取的变量值。关于前置处理器何时被执行的细节,查看作用域规则。

8. 后置处理器(Post-Processor)

后置处理器在取样器请求发出后执行一些动作。如果一个后置处理器被附加到一个请求元件,那它会在那个请求元件启动后执行。一个后置处理器最经常被使用于处理响应数据,经常从用它提取数据。关于后置处理器何时被执行的细节,查看作用域规则。

9. 执行顺序

1.  前置处理器

2.  计时器

3.  取样器

4.  后置处理器 (直到取样结果为空)

5.  断言 (直到取样结果为空)

6.  监听器 (直到取样结果为空)

请注意计时器,断言,前置/后置处理器只有当它们向一个取样器申请时才会执行.逻辑控制器和取样器会按照它们在树中出现的顺序执行.其他的测试元件按照它们被找到的区域和测试元件的类型来执行. [在同一类型中,元件会按照它们在树中出现的顺序执行].

例如,在如下测试中:

· 控制器

o      1号后置处理器
o      1号取样器
o      2号取样器
o      1号计时器
o      1号断言
o      1号前置处理器
o      2号计时器
o      2号后置处理器

执行的顺序会是:

          1号前置处理器

          1号计时器

          2号计时器

          1号取样器

          1号后置处理器

          2号前置处理器

          1号断言

10. 作用域规则

JMeter 测试树包含元件是分等级和顺序的。在测试树中的一些元件是严格分级(监听器,配置元件,后置处理器,前置处理器,断言,定时器),一些主要是顺序的(控制 器,取样器)。当你创建你的测试计划时,你将创建一个描述被执行的步骤集的取样请求(通过取样器)有序列表。这些请求常被组织在有序的控制器中。给出如下 的测试树:

请求的顺序是one,two,three,four。

一些控制器影响它的子元件的顺序,你可以在组件参考看到详细的控制器。 其他元素是分等级的。例如,一个断言在测试树中是分等级的。如果你的父元件是个请求,它就被应用于那个请求。如果它的父元件是控制器,它就影响所有那个控制器下的所有请求。如下测试树:

断言#1 仅被应用于请求 One,断言 #2 仅被应用于 请求 Two 和 Three。 再给另一个例子,这次使用定时器:

在这个例子里,请求的命名显示出它们被执行的顺序。Timer #1 应用于 请求 Two, Three, 和 Four (注意对于分等级的元件怎样的顺序是不相关的)。断言 #1 应用于请求Three。Timer #2 对所有请求有效。

希望这些例子使你弄清了配置(分等级的)元件如何被应用。

元件Header Manager, Cookie Manager 和Authorization manager的配置和默认元件的配置被视为是不同的。默认元件配置的设置并入取样器到达的值的集里。然而来自manager 的设置没有并入。如果一个取样器的范围中有多于一个管理器,那么仅仅一个被使用,但是现在没有办法指定哪个被使用。

到此,把测试计划中元件总结完了。供以后学习使用。

Joyce /
Published under (CC) BY-NC-SA in categories jmeter  tagged with jmeter  testplan