You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 12:35:11