Jmeter测试计划的元素之执行顺序、域规则、属性和变量

发表于:2019-2-18 11:28

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

 作者:软件测试技能栈    来源:软件测试技能栈

#
Jmeter
  测试计划
  要想熟练使用Jmeter测试计划的各个元素,单单知道这些元素本身的作用还不够,与之有关的内容还有测试计划的执行顺序、作用域、Jmeter的属性和变量等,以下我们一一进行学习。
  执行顺序
  Jmeter测试计划元素的执行优先级如下:
  1 配置元件(Configuration elements)
  2 前置处理器(Pre-Processors)
  3 定时器(Timers)
  4 采样器(Sampler)
  5 后置处理器(Post-Processors)(除非服务器响应为空)
  6 断言(Assertions)(除非服务器响应为空)
  7 监听器(Listeners)(除非服务器响应为空)
  请注意:
  定时器、断言、前置处理器和后置处理器仅在它们作用域范围内存在采样器时才被执行;
  逻辑控制器和采样器按照其在测试计划树中的顺序被执行;
  其它测试元素根据其自身的作用域、元素的类型来执行;
  同一种类型的测试元素将按其在测试计划树中的顺序执行。
  例如,如下测试计划:
  执行顺序是:
   Pre-Processor 1
  Timer 1
  Timer 2
  Sampler 1
  Post-Processor 1
  Post-Processor 2
  Assertion 1
  Pre-Processor 1
  Timer 1
  Timer 2
  Sampler 2
  Post-Processor 1
  Post-Processor 2
  Assertion 1
  作用域规则
  Jmeter测试树既包含了遵循层次规则的元素,也包含了遵循顺序规则的元素。
  遵循分层规则:
  监听器、配置元件、前置处理器、后置处理器、断言、定时器等;
  遵循顺序规则:
  控制器、采样器;
  当你创建测试计划时,实际上就创建一个确定了执行顺序的采样器请求,它代表着将被执行的步骤集合。
  请求的顺序是:One -> Two -> Three -> Four
  除控制器和采样器外,其它元素是遵循层次规则的,如断言。如果它的父元素是一个请求,那么它仅对该请求生效。如果它的父元素是一个控制器,那么它对由这个控制器衍生的所有请求都生效。在如下测试计划树中:
  断言“Assertion 1”仅应用于请求“One”,而“Assertion 2”则应用于请求“Two”和“Three”。
  再看一个定时器(Timers)的例子:
  在这个例子中,采样器的命名反映了它们被执行的顺序。定时器“Timer 1”对请求“Two”, “Three”和“Four”生效(注意,遵循分层规则的元素不受顺序规则约束)。断言“Assertion 1”仅对请求“Three”生效,定时器“Timer 2”将对所有请求生效。
  希望这些例子讲清楚了配置元件(遵循层次规则)的作用域规则。
  配置元素头文件管理器(Configuration elements Header Manager)、cookie管理器(Cookie Manager)和授权管理器(Authorization manager)的处理方式与配置默认元件(Configuration Default elements)不同。配置默认元件包含的设置将被合并到一组采样器可以访问的变量值中。但是,前面提到的这些管理器的设置不会被合并。如果一个以上的管理器在采样器的范围内,则只有一个管理器生效,但却无法指定哪个管理器生效。
  属性(Properties)和变量(Variables)
  Jmeter属性均定义在jmeter.properties中。
  属性在jmeter中是全局变量,且大多数用来定义Jmeter使用的一些默认值。
  例如,属性remote_hosts定义了Jmeter在远程模式下将要连接的服务器。属性能够被测试计划引用,但不能用于特定线程的变量值。
  Jmeter变量对每一个线程而言都是局部变量。对于每一个不同的线程,变量的值可以相同,也可以不同。
  如果一个变量的值被某一个线程改变了,则仅仅是该变量在此线程中的副本的值发生了变化。例如,正则表达式提取器后置处理器(Regular Expression Extractor Post-Processor)将根据所在线程的采样器结果更新变量的值,以供相同的线程后续使用。
  注意,由测试计划和用户定义变量(User Defined Variables)配置元素定义的变量在整个测试计划的启动时都是可见的。如果相同变量被多个用户定义变量配置元件定义,那么只有最后一个生效。一旦线程开始,变量集合的初始值就会被拷贝到每一个线程中。像用户参数前置处理器(User Parameters Pre-Processor)或正则表达式提取器后置处理器(Regular Expression Extractor Post-Processor)这样的元素可以被用来重新定义变量(或创建新变量)。这些变量的重定义仅适用于当前线程。
  函数setProperty能够被用来定义一个Jmeter属性。因为Jmeter属性对测试计划是全局的,所以能够在线程间传递信息。
  变量和属性都是大小写敏感的。
  使用变量参数化
  变量并不是要一直是变化的——它们可能被定义一次,而且如果一直不用,将不用改变其值。所以你可以使用变量代替测试计划中频繁出现的表达式,或者用于在一次测试运行期间恒定不变,但在多次测试运行之间可能改变的条目。例如,服务器名称、一个线程组的线程数量。
  当决定如何构建一个测试计划时,记录下哪些在一个测试运行期间恒定不变,但在多次测试运行之间可能会发生改变的变量。确定一些变量的名称——可以使用一个命名规则,如使用前缀C_或K_或使用大写字母,仅用于把它们和需要在测试期间改变的变量进行区分。还需要考虑哪些变量是线程内独享的——例如,从正则表达式后置处理器提取出来的计数器或值。
  例如,你可以在测试计划中定义如下变量:
   HOST             www.example.com
  THREADS          10
  LOOPS            20
  你可以在测试计划中用${HOST}、${THREADS}等来替代。如果以后你想改变主机名,仅仅改变变量HOST的值即可。这对于数量较小的测试来说很奏效,但当测试大量不同组合时就变得冗余了。一个解决方案时使用属性定义这些变量的值,如:
   HOST             ${__P(host,www.example.com)}
  THREADS          ${__P(threads,10)}
  LOOPS            ${__P(loops,20)}
  你可以在命令行中改变这些值中的一些或全部:
 jmeter … -Jhost=www3.example.org -Jloops=13

      上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号