3

我正在使用 JMeter 对 SOAP Web 服务进行负载测试。Web 服务存在于很多地方,比如我的本地主机、开发框、集成框、生产框等。

我正在使用 WebService(SOAP) 请求采样器,并设置了“IP 的服务器名称”、“路径”和“SOAP 操作”参数,如下所示:

Server Name of IP: ${SERVER}
Path: ${PATH}/service
SOAPAction: http://${SERVER}${PATH}service#action

这在使用“用户定义的变量”配置元素时效果很好。我只是将 SERVER 和 PATH 更改为特定于我要命中的位置的任何内容。然而,这比我想处理的更让人头疼。我希望做(并尝试过)的是在我的线程组中添加多个 If Logic Controller 并检查 ${MODE} (另一个 UDV)并采取相应措施,设置我的 SERVER 和 PATH。所以,我有类似的东西

"${MODE}" == "dev"
"${MODE}" == "local"
"${MODE}" == "production"

每个 If Controller 一个,然后我有一个子 UDV 元素设置适当的 SERVER 和 PATH。尽管我假设如果控制器返回 false 将使 UDV 无法被评估,但始终使用来自最后一个 UDV 的值(按我的线程组中出现的顺序)。但是,我在文档中看到,在启动任何线程之前,无论位置如何,都会评估所有 UDV。因此,我尝试改用用户参数,但我的 SOAP 采样器中 ${SERVER} 和 ${PATH} 的值没有被替换,我正在向 http://${SERVER}${PATH} 发出请求,即不好。

有什么优雅的方法来处理这个吗?目前,每次我需要更改正在访问的服务器时,我只是复制粘贴 SERVER 和 PATH 的值。我知道我也可以有多个测试计划,一个用于我要加载测试的每台服务器,但我经常更新结构,包括添加新测试、禁用现有测试和更改 SOAP 请求的某些部分,因此有一堆它们似乎不是一个好的解决方案。

有什么帮助吗?

4

2 回答 2

4

我们使用 BeanShell 采样器和在测试计划本身中定义的变量解决了这个问题。

您可以为整个测试计划定义变量,而不是使用元素“用户定义的变量”。只需单击树的根元素并添加一个名为“mode”的变量,其内容为“dev”、“local”或“production”。

在测试用例中添加采样器“Bean Shell Sampler”并添加以下代码:

if ("dev".equals(vars.get("mode"))) {
 vars.put("server","x.y.z");
}
if ("local".equals(vars.get("mode"))) {
 vars.put("server","127.0.0.1");
}
if ("production".equals(vars.get("mode"))) {
 vars.put("server","10.0.0.10");
}

然后,您可以定义所需的所有变量,并在需要时添加其他环境。

但您也可以更进一步:创建一个简单控制器并将您的 Bean Shell 采样器放在那里。在所有线程组中,您现在可以使用模块控制器访问这个简单控制器。在这种情况下,您只需为整个测试计划定义一次环境选择器。

于 2010-03-04T09:04:49.820 回答
0

就我个人而言,我发现拥有多个 UDV 模块要容易得多,而且都在顶层。

除了我想使用的那个之外,我将它们全部禁用。

我看到有很多方法可以做同样的事情;-)

于 2015-06-22T21:04:35.987 回答