我正在使用JMeter加载测试SOAP Web服务。 webservice存在于很多地方,比如我的localhost,开发盒,集成盒,生产盒等。
我正在使用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"
每个如果控制器上有一个,那么我有一个子UDV元素设置适当的SERVER和PATH。尽管我假设If Controller返回false将保持UDV不被评估,但始终使用上一个UDV的值(按照我的线程组中的出现顺序)。但是,我在文档中看到,在启动任何线程之前,无论位置如何,都会评估所有UDV。所以,我尝试使用User Paramaters,但我的SOAP采样器中的$ {SERVER}和$ {PATH}的值不会被替换,我正在向http:// $ {SERVER} $ {PATH}发出请求,这是不好。
有没有优雅的方法来处理这个?目前我只是在每次需要更改我正在尝试的服务器时复制粘贴SERVER和PATH的值。我知道我也可以有多个测试计划,每个服务器一个,我将加载测试,但我经常更新结构,包括添加新测试,禁用现有测试和更改SOAP请求的某些部分,所以有一堆它们似乎不是一个好的解决方案。
有任何帮助吗?
答案 0 :(得分:4)
我们使用BeanShell Sampler和Testplan本身定义的变量解决了这个问题。
您可以为整个Testplan定义变量,而不是使用元素“User Defined Variables”。只需单击树的根元素,然后添加一个名为“mode”的变量,其内容为“dev”,“local”或“production”。
在测试用例中添加Sampler“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 Sampler放在那里。在所有ThreadGroup中,您现在可以使用模块控制器访问此简单控制器。在这种情况下,您必须为整个Testplan定义一次环境选择器。
答案 1 :(得分:0)
就我个人而言,我发现更容易拥有几个UDV模块,都在顶层。
除了我想要使用的那个之外,我保持他们全部禁用。我看到有很多方法可以做同样的事情; - )