JMeter环境特定配置

kan*_*kan 8 java jmeter

我有几个JMeter测试计划应该在不同的环境中执行,比如Dev,Test,UAT,Live.在每个测试计划中,我想有一个简单的方法来指定使用哪个环境.每个环境都有很多配置,例如主机名,端口,ssl-cert,用户名,密码,帐号和其他测试数据.

我想要实现的一件事是在使用JMeter GUI或从构建脚本运行场景时轻松切换环境.

我的一个想法是使用"包含控制器"来包含另一个jmx文件,该文件包含用户定义变量列表和其他配置元素.但是,JMeter不支持包含文件名中的变量,因此我无法通过环境名称对场景进行参数化.Include Controller支持JMeter参数"includecontroller.prefix",但它不是很灵活,例如我无法从JMeter GUI更改它,我应该更改JMeter配置文件并重新启动它.

我试过使用Switch Controller,但没有运气,它不会切换配置元素,只有采样器.

从测试场景中外部化特定于环境的配置并在多个场景之间共享的最佳实践是什么?

Dmi*_*i T 13

我建议用JMeter属性替换所有特定于环境的变量或值.请参阅以下功能以供参考:

例如,您可以定义hostnamejmeter.properties文件中调用的属性或JMeter命令行参数,如下所示

jmeter -Jhostname=169.140.130.120 -n -t yourscript.jmx -l yourscriptresults.jtl
Run Code Online (Sandbox Code Playgroud)

并在脚本内部引用:

  • ${__P(hostname,)} 要么
  • ${__property(hostname,,)}

有关更多详细信息,请参阅Apache JMeter Properties Customization Guide.

  • @kan,你使用$ {__ P(hostname,"default_value")}例如$ {__ P(hostname,"localhost")},当你使用GUI时,更改参数默认值,当从批处理运行时,你可以定义属性. (2认同)

小智 6

Manish Sapariya提到的一样,参数化控制器对于为多个环境准备配置非常有用.我在之前工作的地方使用它,现在在新的地方开始配置.这在开始时有点工作,但后来很容易维护.上面提供的链接中有一些教程,但不会考虑到你想一次只运行一个env.我将在下面描述一下,也许它会有用.所以,慢慢地一步一步: Env Profiler

  1. 首先 - 您需要两个线程组 - 一个用于环境配置文件(第一个屏幕截图中没有1个 - Env Profiler),一个用于测试用例,包括测试计划等(无2 - API请求).后者必须被禁用,因为它是不应该从这里直接执行的容器(右键单击 - >禁用或Ctrl + T)
  2. 然后你需要你的用户定义变量元素(没有3) - 我正在使用其中三个:
    • 首先定义将要执行的环境(environmentType var)和登录/密码,令牌等.
    • 第二个是测试所需项目的ID
    • 第三个是IP,端口,路径前缀等.

这里最重要的是我在这个时候用变量名前缀分隔它们,所以在一个UDV元素中我有变量,如dev.serverIP,dev.serverPort,preprod.serverIP等等(第二个屏幕截图)填充了值与该环境相关.此外,在其中一个UDV中,我有环境类型变量(前面提到过),默认值为'dev'(您可以在此处手动更改,或者在通过命令行/ CI或其他任何方式启动时提供不同的值)

UDVs

  1. 现在在Env Profiler中我有If控制器(第一个截图上没有4).对于dev env我有(在第一个屏幕上没有5):

    "$ {environmentType}"=="dev"

对于每个env(如果是控制器),您必须提供如上所述的正确条件.

  1. 每个IfController都包含之前提到的"jp @ gc - Parametrized Controller"(顺便提一下,你可以在这里下载Extras Set的一部分).在每个Param控制器中,您可以分配在特定于该环境的测试计划变量中使用的变量,例如名称:serverIP,值:$ {dev.serverIP} for dev env(第三个屏幕截图)

参数化控制器

  1. 现在最后一件事 - 你想要执行的测试和计划.
    • 在该禁用的线程组(API请求)中,您添加包含测试的简单控制器包含从其他文件导入某些测试的包含控制器.
    • 当您进行这些测试时,对于要在该特定环境中运行的每个测试,您必须在Parametrized Controller中添加Module cotroller以及该测试的路径(下面的屏幕截图)

模块控制器

这就是它.现在保持:

  • 要添加新变量,你必须在UDV中添加前缀(dev.newVar,preprod.newVar)并填充相关值,然后在参数化控制器中添加适当的条目(那些newVar = $ {dev.newVar})就是这样的
  • 从其他测试计划添加新测试 - 添加包含该文件路径的控制器,并在每个Paramterized控制器中添加模块控制器,将它们指向包含控制器
  • 添加新环境只需复制你已经拥有的环境,更改它的if控制,参数化控制器和UDV中的填充值这里的好处是,如果你想要,让我们说,dev env与所有测试和另一个只是一些somke测试你可以准备一个副本,更改如果控制器采取一些其他的env变量值(如dev用于所有测试,devsmoke用于冒烟测试)并添加或删除该新配置文件中的一些模块控制器.当然你可以建立一些它,你可以为系统的不同部分使用不同的线程,以便更容易维护,只是不要忘记禁用那些用作容器的线程.

我知道你开始的时候要做的事情很多,但是之后的情况并没有那么糟糕,只是添加一些东西 - 可能是最简单的方法.


Man*_*iya 1

我自己没有使用过,但是这个jmeter-pluing 可能对你有帮助。这是文档的片段

Parameterized Controller since 0.1.0

When your JMeter test plan tree becomes like a sequoia or a banyan, 
you start feeling yourself like a monkey in a jungle, jumping from 
branch to branch, trying to support this important test consistent. 
You really need some way to have parameterized subroutines, to reuse 
parts of test plan like regular programming language functions and 
procedures.

JMeter have out-of-box Module controller, but it has no parameters 
to pass to, so if you need to call repeating sequence of the same 
action with different parameters, your reflection in a mirror starts 
morphing into monkey. Parameterized Controller helps you stay human 
and sane.
Run Code Online (Sandbox Code Playgroud)