如何在Karate Feature文件中按环境条件动态设置API密钥?
基于Karate+Python实现环境适配的API密钥切换方案
方案1:在Karate Feature文件内直接实现条件逻辑
直接借助Karate支持的JavaScript语法完成环境判断,无需额外依赖外部脚本:
Scenario: xyz # 定义当前测试的Endpoint(可从外部传入或直接指定) * def Endpoint = '<实际测试端点>' # 初始化API密钥变量 * def API_KEY = '' # 根据Endpoint关键字匹配环境并设置密钥 * if (Endpoint.includes('dev')) * API_KEY = 'dev api key' * else if (Endpoint.includes('sig')) * API_KEY = 'Staging api key' # 原有业务逻辑 * def something = abc * def result = karate.exec("curl -X blah blah" + API_KEY + Endpoint)
也可以用更简洁的三元表达式写法:
Scenario: xyz * def Endpoint = '<实际测试端点>' * def API_KEY = Endpoint.includes('dev') ? 'dev api key' : (Endpoint.includes('sig') ? 'Staging api key' : '') * def something = abc * def result = karate.exec("curl -X blah blah" + API_KEY + Endpoint)
方案2:通过Python传递环境变量(适配GitHub自动化场景)
更适合CI/CD流水线的方式:通过Python读取环境变量,将配置传递给Karate,避免在Feature中硬编码判断逻辑。
步骤1:配置Karate全局config.js
在Karate项目根目录创建config.js,用于根据环境加载对应配置:
function fn() { // 从系统属性或环境变量获取当前测试环境,默认dev var env = karate.env || 'dev'; var config = {}; if (env === 'dev') { config.apiKey = 'dev api key'; config.endpoint = 'https://dev-your-domain.com/path'; } else if (env === 'staging') { config.apiKey = 'Staging api key'; config.endpoint = 'https://sig-your-domain.com/path'; } return config; }
步骤2:Python脚本启动Karate并传递环境变量
Python读取GitHub Actions中设置的环境变量,传递给Karate:
import os import subprocess # 从环境变量获取测试环境,默认dev test_env = os.getenv('TEST_ENV', 'dev') # 启动Karate并指定环境 subprocess.run(['karate', f'-Dkarate.env={test_env}', 'your-feature-file.feature'])
步骤3:Feature文件直接使用全局配置
Scenario: xyz * def something = abc # 直接调用config中的预定义变量 * def result = karate.exec("curl -X blah blah" + config.apiKey + config.endpoint)
步骤4:GitHub Actions中设置环境变量
在GitHub Actions的Workflow文件中配置环境变量:
jobs: test: runs-on: ubuntu-latest steps: - name: 执行dev环境测试 env: TEST_ENV: dev run: python your-test-script.py - name: 执行staging环境测试 env: TEST_ENV: staging run: python your-test-script.py
内容的提问来源于stack exchange,提问作者ram
相关产品推荐
相关产品推荐

