JMeter环境特定配置

时间:2014-03-19 15:04:48

标签: java jmeter

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

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

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

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

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

8 个答案:

答案 0 :(得分:13)

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

例如,您可以在 jmeter.properties 文件中定义名为hostname的属性,或者如下所示在JMeter命令行参数中定义

jmeter -Jhostname=169.140.130.120 -n -t yourscript.jmx -l yourscriptresults.jtl

并在脚本内部引用:

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

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

答案 1 :(得分:6)

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

  1. 首先 - 您需要两个线程组 - 一个用于环境配置文件(第一个屏幕截图中没有1 - Env Profiler)和一个用于您的测试案例,包括测试计划等(无2 - API请求)。 后者必须被禁用,因为它不是直接从此处执行的容器(右键单击 - >禁用或Ctrl + T)
  2. 然后你需要用户定义的变量元素(没有3) - 我使用其中三个:
    • 首先定义将要执行的环境(environmentType var)和登录/密码,令牌等。
    • 第二个,包含测试所需物品的ID
    • 第三个是IP,端口,路径前缀等。
  3. 这里最重要的是我现在用变量名中的前缀将它们分开,所以在一个UDV元素中我有变量,如 dev.serverIP,dev.serverPort,preprod.serverIP 等等(第二个屏幕截图)填充了与该环境相关的值。 此外,在其中一个UDV中,我有一个带有默认值' dev'的环境类型变量(前面提到过)。 (您可以在此处手动更改,或在通过命令行/ CI或其他任何方式启动时提供不同的值)

    UDVs

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

      <强>&#34; $ {environmentType}&#34; ==&#34; dev&#34;

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

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

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

          而且它几乎就是这样。现在保持:

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

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

答案 2 :(得分:2)

作为当前的解决方案,我使用带有自定义JavaScript代码的JSR223采样器来设置外部属性文件中的变量。这样的事情:

var file = new java.io.File(args[0]);
var props = new java.util.Properties();
var is = new java.io.FileInputStream(file);
props.load(is);
is.close();
for(var it = props.entrySet().iterator(); it.hasNext();)
{
    var entry = it.next();
    vars.put(entry.getKey(), entry.getValue());
}

现在我只需将此代码添加为测试计划中的第一个采样器,并将环境特定的文件路径作为采样器参数args[0]传递,它将从文件中加载变量并将它们作为JMeter变量放置。

答案 3 :(得分:1)

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

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.

答案 4 :(得分:0)

我有同样的问题。我目前的方法是有几个用户定义的变量(UDV)元素,例如DevVariables,TestVariables等。每个元素都定义了相同的变量(主机名,端口等)。然后我手动禁用那些没有使用的UDV元素。

编辑:

JMeter User Manual州 - &#34;用户定义的变量元素允许您定义一组初始变量,就像在测试计划中一样。请注意,测试计划中的所有UDV元素 - 无论它们在何处 - 都在开始时处理。&#34;我不确定什么事件构成了&#34; start&#34;,但这听起来好像你不能有条件地包含UDV,至少不能通过控制器。

您可以为每个测试计划设置一个UDV,您可以在其中设置各种变量(主机等)。也许你可以使用一个丑陋的JavaScript函数设置每个变量的值,该函数键入传入的属性值。

您可以尝试在Apache JMeter User mailing list上提问。必须有办法做你想做的事。

答案 5 :(得分:0)

我使用带有Groovy的JSR223采样器来注册新参数。确保将JSR223采样器放在Only Once Controller中,因此它只运行一次(每个线程)。

我在测试计划中为所有环境注册了所有变量,如下所示:

TEST.user = 123
TEST.url = test.mysite.com
LOAD.user = 435
LOAD.url = load.mysite.com

然后我在启动时使用命令行参数指定要选择的环境,如:-Denvironment=TEST

我的JSR223脚本会在没有TEST的情况下向测试添加新变量。字首。在我的脚本中,我只是引用${user}

这是要使用的脚本:

JMeterVariables jmv = new JMeterVariables();

for (Map.Entry item : vars.entrySet()) {
    if (item.getKey().startsWith(env)) {
        String keyname = item.getKey().substring(env.length()+1);
        String origval = vars.get(keyname);
        if (origval==null || (origval.equals("") && !item.getValue().equals(""))) {
            jmv.put(keyname, item.getValue());
        }
    }
}
if (!jmv.entrySet().isEmpty()) {
    vars.putAll(jmv);
}

答案 6 :(得分:0)

我意识到这个问题已经过时了,但如果您正在使用GUI并手动运行测试,一种非常简单的方法是在每个环境中都有一个User Defined Variables元素,并且在运行测试时只启用其中一个元素。但我仍然不明白为什么jmeter不支持有条件地设置UDV:

答案 7 :(得分:0)

如果您希望简化 GUI 中的生活,一种简单的方法是针对每种环境复制您的 User Defined Variables (用户定义变量),并禁用除您要针对其执行测试的环境,如下所示:

enter image description here