如何在Karate中存储callSingle调用生成返回的实体ID?
问题原因
Karate默认每个Scenario(包括Scenario Outline的每一行迭代)都会重置Background中定义的变量,你每次迭代修改的ids都是当前迭代的独立副本,因此最终只能拿到最后一次迭代的赋值结果。
解决方案
方案一:关闭场景变量隔离(最简便)
在被调用的createEntities.feature文件最顶部(Background块之前)添加配置configure scenarioVariables = false,即可让所有Scenario Outline的迭代共享同一个变量上下文,Background定义的ids不会被重复初始化,所有ID都会正常存储。
示例代码:
# 关闭单场景变量隔离,所有迭代共享全局上下文 * configure scenarioVariables = false Background: * def ids = {} Scenario Outline: 创建实体 # 此处保留你原有接口请求逻辑 * url '你的实体创建接口地址' * request <entityPayload> * method post * status 201 * set ids.<index> = response.id Examples: | index | entityPayload | | user | { "name": "测试用户" } | | order | { "amount": 100 } |
配置后karate.callSingle返回的result.ids就会包含所有实体的ID。
方案二:改用循环实现批量创建
如果你不想修改默认的场景隔离规则,可以放弃Scenario Outline,改用单场景循环完成实体创建,循环内的变量默认共享上下文,不会被重置:
Background: * def ids = {} # 定义所有需要创建的实体配置 * def entityList = [ { index: 'user', payload: { name: '测试用户' } }, { index: 'order', payload: { amount: 100 } } ] Scenario: 批量创建所有实体 * for (let i = 0; i < entityList.length; i++) { let entity = entityList[i]; // 执行接口请求 karate.set('request', entity.payload); karate.method('post'); karate.url('你的实体创建接口地址'); karate.status(201); // 存储返回ID ids[entity.index] = karate.get('response.id'); }
内容的提问来源于stack exchange,提问作者Anakin001
相关产品推荐
相关产品推荐

