如何在Karate主功能文件中访问Mock服务器变量或请求记录
Karate中跨Feature共享Mock服务器捕获的变量解决方案
你需要验证API1响应中的transactionId与Mock服务器收到的API2请求中的transactionId一致,但Mock Feature里定义的tranRef无法在主Feature中访问——这是因为Karate默认隔离不同Feature的变量作用域,得通过全局状态存储来实现跨Feature的变量共享,以下是两种可行方案:
方案1:用karate.set()存储全局变量
修改Mock Feature,把捕获到的tranRef存入Karate全局作用域:
Feature: stateful mock server Background: Mock Scenario: pathMatches('/abcd') && bodyPath('/Envelope/Body/infoRequest')!= null * match karate.typeOf(request) == 'xml' * xml respInfo = read('classpath:org/xbspro/hos/payloads/infoResponse.xml') * def tranRef = $request/Envelope/Body/infoRequest/transactionId # 将变量存入全局作用域 * karate.set('globalTranRef', tranRef) * set respInfo/Envelope/Body/infoResponse/transactionId= tranRef * def response = respInfo
主Feature中从全局作用域取变量并断言:
* call read('classpath:Abstract.feature') * xml remResp = response # 获取Mock捕获的transactionId * def mockTranRef = karate.get('globalTranRef') # 验证两个值一致 * match remResp //transactionId == mockTranRef
方案2:通过callSingle返回值传递变量
如果Mock服务器是用callSingle启动的,可直接通过返回值传递变量:
修改Mock Feature,把tranRef作为返回结果的一部分:
Feature: stateful mock server Background: Mock Scenario: pathMatches('/abcd') && bodyPath('/Envelope/Body/infoRequest')!= null * match karate.typeOf(request) == 'xml' * xml respInfo = read('classpath:org/xbspro/hos/payloads/infoResponse.xml') * def tranRef = $request/Envelope/Body/infoRequest/transactionId * set respInfo/Envelope/Body/infoResponse/transactionId= tranRef * def response = respInfo # 返回捕获的transactionId * def result = { tranRef: tranRef }
主Feature启动Mock时接收返回值:
# 启动Mock并接收返回的变量 * def mockResult = callSingle('classpath:your-mock.feature') * call read('classpath:Abstract.feature') * xml remResp = response # 验证一致性 * match remResp //transactionId == mockResult.tranRef
注意事项
- 用全局变量时,若涉及并行测试可能出现变量冲突,建议测试结束后用
karate.remove('globalTranRef')清理变量。 - 确保Mock服务器在API1请求前已启动,且请求能正确路由到Mock。
内容的提问来源于stack exchange,提问作者shrik18
相关产品推荐
相关产品推荐

