如何在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
相关产品推荐
相关产品推荐

