我有几个JMeter测试计划应该在不同的环境中执行,比如Dev,Test,UAT,Live。在每个测试计划中,我想有一个简单的方法来指定使用哪个环境。每个环境都有很多配置,如主机名,端口,ssl-cert,用户名,密码,帐号和其他测试数据。
我想要实现的一件事是在使用JMeter GUI或从构建脚本运行场景时轻松切换环境。
我的一个想法是使用“Include Controller”来包含另一个jmx文件,该文件包含用户定义变量列表和其他配置元素。但是,JMeter不支持包含文件名中的变量,因此我无法通过环境名称对场景进行参数化。 Include Controller支持JMeter参数“includecontroller.prefix”,但它不是很灵活,例如我无法从JMeter GUI更改它,我应该更改JMeter配置文件并重新启动它。
我曾尝试使用Switch Controller,但没有运气,它不会切换配置元素,只会采样。
从测试场景中外部化特定于环境的配置并在多个场景之间共享它的最佳实践是什么?
答案 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对于准备多个环境的配置非常有用。我在之前工作的地方使用它,现在在新的地方开始配置。这在开始时有点工作,但后来很容易维护。上面提供的链接中有一些教程,但它不会考虑到你想一次只运行一个环境。我将在下面描述一下,也许它会有用。 所以,慢慢地一步一步:
这里最重要的是我现在用变量名中的前缀将它们分开,所以在一个UDV元素中我有变量,如 dev.serverIP,dev.serverPort,preprod.serverIP 等等(第二个屏幕截图)填充了与该环境相关的值。 此外,在其中一个UDV中,我有一个带有默认值' dev'的环境类型变量(前面提到过)。 (您可以在此处手动更改,或在通过命令行/ CI或其他任何方式启动时提供不同的值)
现在在Env Profiler中我有If控制器(第一个屏幕截图中没有4)。对于dev env我有(在第一个屏幕上没有5):
<强>&#34; $ {environmentType}&#34; ==&#34; dev&#34;
对于每个env(如果是控制器),你必须提供如上所述的正确条件。
而且它几乎就是这样。现在保持:
我知道你开始时要做的事情很多,但是之后的情况并没有那么糟糕,只是添加一些东西 - 可能是最简单的方法。
答案 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)