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

如何在Karate测试框架中读取.ENV文件的环境变量值

核心原因

java.lang.System.getenv() 仅会读取测试进程启动时已注入到运行环境的系统/用户级环境变量,不会自动扫描加载项目目录下的.env文件。系统自带的PATH属于预置环境变量因此可以正常读取,你自定义在.env里的密钥没有被加载进进程环境,自然返回null。

可落地方案

不需要维护额外的secrets.js文件,也不用强制引入第三方依赖,直接用Karate原生能力就能实现本地.env、CI环境变量的自动适配,优先级逻辑为「CI注入的系统环境变量 > 本地.env文件配置 > 代码默认配置」,完全满足不同环境的适配需求。

方案1:零依赖原生实现(推荐)

直接在karate-config.js中增加.env解析逻辑,代码如下:

function fn() {
  var config = {};
  // 读取项目根目录下的.env文件,不存在则跳过(CI环境场景)
  var envPath = karate.properties['user.dir'] + '/.env';
  if (karate.fileExists(envPath)) {
    var fileContent = karate.read(envPath, 'utf8');
    fileContent.split('\n').forEach(function(line) {
      line = line.trim();
      // 跳过空行、#开头的注释行
      if (!line || line.startsWith('#')) return;
      // 兼容值中包含等号、首尾带引号的场景
      var keyVal = line.split('=');
      var envKey = keyVal[0].trim();
      var envVal = keyVal.slice(1).join('=').trim().replace(/^['"]|['"]$/g, '');
      config[envKey] = envVal;
    });
  }
  // 加载系统注入的环境变量(含Azure DevOps配置的流水线变量),覆盖本地.env的同名配置
  var systemEnv = java.lang.System.getenv();
  var envIterator = systemEnv.keySet().iterator();
  while (envIterator.hasNext()) {
    var key = envIterator.next();
    config[key] = systemEnv.get(key);
  }

  // 原有业务配置逻辑保持不变即可
  config.baseUrl = 'https://your-test-api.com';
  return config;
}

这个方案的适配逻辑:

  • 本地开发:在项目根目录创建.env文件,按KEY=VALUE格式写入密钥等敏感配置,将.env加入.gitignore规则即可,不会被提交到代码仓库
  • Azure DevOps Pipelines运行:不需要在代码仓库中存放.env文件,直接在流水线的变量组/流水线变量中配置同名的敏感密钥,系统会自动将变量注入测试进程,代码会优先读取这部分配置,不需要做任何额外适配

方案2:第三方依赖实现(可选)

如果不想自己写解析逻辑,可以引入Java版dotenv依赖,以Maven为例,在pom.xml中加入:

<dependency>
  <groupId>io.github.cdimascio</groupId>
  <artifactId>java-dotenv</artifactId>
  <version>5.2.2</version>
  <scope>test</scope>
</dependency>

之后在karate-config.js开头加入加载逻辑即可:

var Dotenv = Java.type('io.github.cdimascio.dotenv.Dotenv');
var dotenv = Dotenv.configure().ignoreIfMissing().load();
config.MY_KEY = dotenv.get('MY_KEY');

该依赖会自动优先读取系统环境变量,不存在时再读取本地.env文件,同样可以适配本地和CI场景,缺点是需要额外引入第三方包。

注意事项
  • Azure DevOps中配置敏感变量时,务必勾选「Keep this value secret」选项,避免密钥在流水线日志中明文打印
  • 配置完.gitignore规则后,建议执行git status确认.env文件不会被Git跟踪,防止敏感信息误提交
  • 废弃之前使用的karate.merge('secrets.js')方案,该方案需要在每个运行环境单独维护secrets.js文件,维护成本高且依然存在敏感文件泄露风险

内容的提问来源于stack exchange,提问作者RuSm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 19:48:29