如何在Karate中遍历动态对象数组并将其作为测试参数?
解决方案
1. 改造可复用的getCarIds.feature
让这个辅助用例返回生成的ID feeder数组,确保任何测试用例调用它时都能拿到动态数据:
Feature: Get car IDs Scenario: Get car IDs * call read('classpath:x/automation/cars/getAllCars.feature') * def carIds = $response[*].id * def carFeeder = karate.mapWithKey(carIds, 'carId') # 返回feeder供外部测试用例使用 * return carFeeder
2. 在getCarParameters.feature中调用并遍历ID
调用改造后的getCarIds.feature获取动态ID列表,再通过Scenario Outline结合feeder循环执行单ID测试:
Feature: Get parameters of each car Scenario: Fetch car ID feeder # 调用辅助用例并接收返回的feeder * def carFeeder = call read('classpath:x/automation/cars/getCarIds.feature') Scenario Outline: Get parameters for single car Given url carUrl + '/carparameters' And param carId = <carId> When method GET Then status 200 # 使用feeder驱动循环执行 Examples: | carFeeder |
如果偏好更简洁的写法,也可以直接用call遍历feeder调用拆分后的单ID测试用例:
Feature: Get parameters of each car Scenario: Get parameters for each car * def carFeeder = call read('classpath:x/automation/cars/getCarIds.feature') # 遍历feeder执行单ID测试逻辑 * call read('classpath:x/automation/cars/_getSingleCarParams.feature') carFeeder
拆分出的_getSingleCarParams.feature(单ID测试逻辑):
Feature: Helper for single car params Scenario: Get params for one car Given url carUrl + '/carparameters' And param carId = <carId> When method GET Then status 200
3. 适配其他测试用例的复用需求
如果其他测试需要直接使用原始ID数组而非feeder,可修改getCarIds.feature返回包含两种数据的对象:
Feature: Get car IDs Scenario: Get car IDs * call read('classpath:x/automation/cars/getAllCars.feature') * def carIds = $response[*].id * def carFeeder = karate.mapWithKey(carIds, 'carId') # 返回包含原始ID数组和feeder的对象 * return { ids: carIds, feeder: carFeeder }
调用时按需取值:
* def carData = call read('classpath:x/automation/cars/getCarIds.feature') * def rawIds = carData.ids * def feeder = carData.feeder
这样getCarIds.feature就成为完全解耦的公共数据模块,所有测试用例都能独立调用它获取所需的ID数据,无需绑定特定测试逻辑。
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

