Karate中能否基于一个feature的响应值触发另一指定feature执行
解决方案
核心实现逻辑
- 用户导入接口为异步逻辑,提交请求后不会立刻返回最终执行结果,需要轮询查询任务状态
- 配置合理的轮询间隔和超时阈值,避免无限等待或者超时误判
- 确认导入任务状态为
Success后再调用清理接口对应的Feature B,避免设备组被提前删除
修改后的Feature A(用户导入)代码
Feature: 用户导入 Background: - url baseURL - header Content-Type = 'application/json' - header Authorization = custToken.token - def dev = call read('DG2Retrieve Device Groups of a Customer.feature') - def deviceGroupId1 = dev.response.listGetAllDeviceGroup[0].deviceGroupId - def deviceGroupId2 = dev.response.listGetAllDeviceGroup[1].deviceGroupId - def deviceGroupId3 = dev.response.listGetAllDeviceGroup[2].deviceGroupId - def deviceGroupId4 = dev.response.listGetAllDeviceGroup[3].deviceGroupId # 轮询参数配置:可根据实际导入耗时调整,当前配置为总超时1分钟,每2秒查询一次 - def pollInterval = 2000 - def maxRetry = 30 Scenario: 执行用户导入 Given path '/v1/uploadusercsvfile' And header Content-Type = 'multipart/form-data' And multipart file file = { read: '../com.zerv.testdata/userData.csv',filename: 'userData.csv', contentType: 'multipart/form-data'} And form field userDeviceAndGroupData = {"listDeviceGroupIds" : ['#(deviceGroupId1)','#(deviceGroupId2)','#(deviceGroupId3)','#(deviceGroupId4)']} When method POST Then status 200 # 提取异步任务ID,可根据接口实际返回字段调整 * def taskId = response.taskId * def retryCount = 0 # 任务状态轮询逻辑,接口路径请替换为实际的任务状态查询接口 * def checkImportStatus = """ function() { if(retryCount >= maxRetry) return { status: 'timeout' } java.lang.Thread.sleep(pollInterval) retryCount++ karate.call('get', '/v1/import/task/status/' + taskId) return response } """ # 等待直到任务返回成功或超时 * def taskResult = callonce checkImportStatus until (res) => res.status == 'success' || res.status == 'timeout' * match taskResult.status == 'success' # 导入成功后调用清理Feature B * call read('CleanUp Api.feature')
配置说明
- 如果你的导入接口没有单独的任务查询接口,直接将轮询逻辑中的请求替换为对应结果查询逻辑即可
- 若导入任务支持失败状态返回,可以在轮询判断中增加失败状态的分支,直接终止测试抛出异常
- 轮询的间隔和最大重试次数可以根据实际业务的导入耗时灵活调整
内容的提问来源于stack exchange,提问作者Suresh Kumar
相关产品推荐
相关产品推荐

