如何在Karate运行时于Feature文件内更新karate.env变量?
运行时更新Karate.env的方法
核心原因
Karate在启动阶段会读取karate.env系统属性并将其缓存到上下文变量中,后续即使通过代码修改系统属性,karate.env变量也不会自动同步更新——这就是你看到系统属性已成功修改,但Feature中打印的karate.env始终为null的根本原因。
解决方案
方法1:直接在Feature中同步上下文变量
不需要修改Java类,只需在每次更新系统属性后,手动将karate.env变量同步为最新的系统属性值:
Feature: Update Karate.env for local run with Run>> plugin option above individual scenario Background: * def systemProperties = Java.type('commonutilhelpers.SystemProperties') Scenario: Set karate.env * systemProperties.SetKarateEnv('dev') * karate.env = systemProperties.systemPropertyValue('karate.env') * print 'karate.env is now ', karate.env * systemProperties.SetKarateEnv('uat') * karate.env = systemProperties.systemPropertyValue('karate.env') * print 'karate.env is now ', karate.env * systemProperties.SetKarateEnv('qa') * karate.env = systemProperties.systemPropertyValue('karate.env') * print 'karate.env is now ', karate.env
方法2:在Java类中直接操作Karate上下文(推荐)
如果需要通过Java代码统一处理更新逻辑,可以利用Karate的ThreadContext和ScenarioContext API,直接修改Karate上下文里的karate.env变量:
package commonutilhelpers; import com.intuit.karate.ScriptValue; import com.intuit.karate.core.ScenarioContext; import com.intuit.karate.ThreadContext; public class SystemProperties { public static String systemPropertyValue(String propertyName) { return System.getProperty(propertyName); } public static void SetKarateEnv(String environment) { System.setProperty("karate.env", environment); // 同步更新Karate上下文的env变量 ScenarioContext context = ThreadContext.getScenarioContext(); context.set("karate.env", new ScriptValue(environment)); String verifiedEnvUpdated = systemPropertyValue("karate.env"); System.out.println("verifiedEnvUpdated is " + verifiedEnvUpdated); } }
修改后,Feature文件无需额外同步步骤,直接打印karate.env就能看到更新后的值:
Feature: Update Karate.env for local run with Run>> plugin option above individual scenario Background: * def systemProperties = Java.type('commonutilhelpers.SystemProperties') Scenario: Set karate.env * systemProperties.SetKarateEnv('dev') * print 'karate.env is now ', karate.env * systemProperties.SetKarateEnv('uat') * print 'karate.env is now ', karate.env * systemProperties.SetKarateEnv('qa') * print 'karate.env is now ', karate.properties['karate.env']
补充提示
karate.properties是Karate启动时生成的属性快照,不会随系统属性变化自动更新。如果要获取最新的系统属性值,建议直接调用systemProperties.systemPropertyValue('karate.env')。- 若只是本地通过插件运行单个Feature/场景,更简便的方式是在运行配置中直接设置
karate.env系统属性,无需在代码中动态修改。
内容的提问来源于stack exchange,提问作者mike
相关产品推荐
相关产品推荐

