如何将数据库数组数据传入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
相关产品推荐
相关产品推荐

