You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将数据库数组数据传入Karate的Examples实现多用例测试

Karate中如何用动态数组生成多个测试用例

不行,Karate的Scenario Outline的Examples区块只支持静态硬编码数据,没办法直接传入动态生成的数组(比如你从数据库查询得到的externalIdArray)。

要实现你的需求——遍历数组中每个元素生成独立测试用例,有两种常用方案:

方案1:用karate.forEach直接在Scenario中循环

把原来的Scenario Outline改成普通Scenario,用karate.forEach遍历数组,每次迭代执行一次请求逻辑:

Feature: Testing data

Background:
* def app = Java.type('library.classes.application')
* configure retry = { count: 4, interval: 5000 }
* def config = { username: 'username', password: 'password', url: 'url', driverClassName: 'oracle' }
* def DbUtils = Java.type('library.classes.dbUtils')
* def db = new DbUtils(config)
* def externalIds = db.readRows('SELECT EXTERNAL_ID FROM PRODUCT')
* def externalIdArray = karate.map(externalIds, function(x){ return x.EXTERNAL_ID })
* print externalIdArray

Scenario: Testing data for each external ID
* karate.forEach(externalIdArray, function(currentId){
    * def requestID = app.GenerateRequestId()
    * def createRequest = karate.read('../model/request.xml')
    * replace createRequest
      | token              | value        |
      | @@@REQUEST_ID@@@   | requestID    |
      | @@@PRODUCT_ID@@@   | currentId    |
    * print createRequest
    * request createRequest
    * method post
    * print response
    * status 200
  })

这种方式简单直接,数组中的每个元素都会触发一次完整的请求流程,和Scenario Outline的执行逻辑一致。

方案2:用karate.call调用独立Feature生成独立测试报告条目

如果需要每个测试迭代在报告中显示为独立的测试用例,可以把单个测试逻辑抽成单独的Feature文件,再用karate.forEach循环调用:

步骤1:创建单个测试的Feature文件(比如single-product-test.feature)

Feature: Single Product Test

Scenario: Validate product with ID <externalId>
* def requestID = app.GenerateRequestId()
* def createRequest = karate.read('../model/request.xml')
* replace createRequest
  | token              | value        |
  | @@@REQUEST_ID@@@   | requestID    |
  | @@@PRODUCT_ID@@@   | externalId   |
* print createRequest
* request createRequest
* method post
* print response
* status 200

步骤2:在主Feature中循环调用该文件

Feature: Testing data

Background:
* def app = Java.type('library.classes.application')
* configure retry = { count: 4, interval: 5000 }
* def config = { username: 'username', password: 'password', url: 'url', driverClassName: 'oracle' }
* def DbUtils = Java.type('library.classes.dbUtils')
* def db = new DbUtils(config)
* def externalIds = db.readRows('SELECT EXTERNAL_ID FROM PRODUCT')
* def externalIdArray = karate.map(externalIds, function(x){ return x.EXTERNAL_ID })
* print externalIdArray

Scenario: Run tests for all products
* karate.forEach(externalIdArray, function(currentId){
    * karate.call('single-product-test.feature', { externalId: currentId })
  })

这种方式下,每个数组元素对应的测试都会在报告中单独展示,便于定位问题。


内容的提问来源于stack exchange,提问作者HonzaNova

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 05:07:32