如何在长时间运行的Karate测试中自动刷新Token?
解决Karate令牌自动刷新问题
针对批量执行大量Feature或单场景执行超时导致令牌过期的问题,你可以通过封装带过期检查的令牌获取逻辑,实现每25分钟自动刷新令牌,具体方案如下:
1. 修改karate-config.js配置
将原一次性获取令牌的逻辑,改为带缓存和过期检查的动态获取机制:
// 初始化令牌缓存,存储各角色令牌及过期时间戳 var tokenCache = { admin: { token: null, expiresAt: 0 }, user: { token: null, expiresAt: 0 } }; // 刷新令牌核心函数:调用GetTokens.feature获取新令牌并更新缓存 function refreshTokens() { // 用karate.call而非callSingle,确保每次刷新都重新获取令牌 var jwt = karate.call("classpath:GetTokens.feature", config); tokenCache.admin.token = jwt.admin; tokenCache.user.token = jwt.user; // 设置过期时间为当前时间 + 25分钟(转换为毫秒),提前5分钟刷新避免过期 var currentTime = new Date().getTime(); tokenCache.admin.expiresAt = currentTime + 25 * 60 * 1000; tokenCache.user.expiresAt = currentTime + 25 * 60 * 1000; } // 封装管理员有效令牌获取函数 config.getValidAdminToken = function() { var currentTime = new Date().getTime(); // 如果令牌未初始化或已到刷新时间,重新获取 if (!tokenCache.admin.token || currentTime >= tokenCache.admin.expiresAt) { refreshTokens(); } return tokenCache.admin.token; }; // 封装普通用户有效令牌获取函数 config.getValidUserToken = function() { var currentTime = new Date().getTime(); if (!tokenCache.user.token || currentTime >= tokenCache.user.expiresAt) { refreshTokens(); } return tokenCache.user.token; }; // 初始化时先获取一次令牌 refreshTokens();
2. 在Feature文件中使用动态令牌
不再直接使用config.admin或config.user,而是调用封装好的获取函数获取有效令牌:
Feature: 示例接口测试 Scenario: 管理员访问接口 Given url baseUrl + "/admin/api" And header Authorization = "Bearer " + config.getValidAdminToken() When method get Then status 200 Scenario: 普通用户访问接口 Given url baseUrl + "/user/api" And header Authorization = "Bearer " + config.getValidUserToken() When method get Then status 200
方案说明
- 自动过期检查:每次使用令牌前都会校验当前时间是否超过预设的25分钟刷新阈值,过期则自动调用
GetTokens.feature获取新令牌。 - 提前刷新:设置25分钟刷新间隔,比令牌30分钟有效期提前5分钟,避免因网络延迟或场景执行时长导致令牌在请求中途过期。
- 全局复用逻辑:所有Feature文件统一调用
config.getValidAdminToken()/config.getValidUserToken(),无需在每个文件单独处理刷新逻辑。
内容的提问来源于stack exchange,提问作者TheOnlyKiller
相关产品推荐
相关产品推荐

