Karate调用feature未返回所有def定义变量,原因咨询
问题:调用Karate Feature文件无法同时获取多个Scenario的变量
我有如下karate-config-test.js配置文件:
function fn() { var env = karate.env; // get system property 'karate.env' var baseUrl = "http://localhost:5000" var config = { env: env, baseUrl: baseUrl }; //open connection to message broker (mqtt, amqp) var async_message = karate.callSingle('classpath:com/connect/apitests/commons/async_message/async_message.feature', config); config.mqtt = async_message.mqtt config.amqp = async_message.amqp return config; }
以及如下async_message.feature文件:
@ignore Feature: utility that instance async message broker Background: * url baseUrl Scenario: Set instance of a class AmqpUtils And MqttUtils * def amqp = 'pippo' Scenario: Set instance of a class MqttUtils * def mqtt = 'pluto'
当我查看async_message变量的值时,发现仅包含其中一个Scenario的变量(例如仅mqtt),并未同时获取到两个Scenario中定义的变量。但我在Karate文档中看到说明:所有在被调用脚本中用def定义的变量,会以类JSON对象的键形式返回。请问这一现象的原因是什么?
答案
核心原因是:Karate调用.feature文件时,默认只会执行第一个Scenario,后续的Scenario不会被运行。
你当前的async_message.feature里有两个独立的Scenario,当通过karate.callSingle调用时,只会执行第一个定义amqp的Scenario,第二个定义mqtt的Scenario根本没被执行,所以返回的async_message自然只有amqp;如果第一个Scenario没执行成功(比如被跳过),才会轮到第二个,但显然你这里的第一个是正常执行的,所以第二个就被忽略了。
要解决这个问题,只需要把两个变量的定义合并到同一个Scenario里即可:
@ignore Feature: utility that instance async message broker Background: * url baseUrl Scenario: Set instances of AmqpUtils and MqttUtils * def amqp = 'pippo' * def mqtt = 'pluto'
这样调用后,async_message就会同时包含amqp和mqtt两个键值对,符合你的预期。
内容的提问来源于stack exchange,提问作者Rachid G
相关产品推荐
相关产品推荐

