Karate框架中Examples另作他用时如何从CSV读取数据传递给调用的feature
适配多CSV数据行的实现方案
根据你的使用场景可以选择以下两种实现方式:
方案1:CSV行数与Examples行数一一对应
直接使用Karate内置的__num变量即可,该变量为当前Scenario Outline执行行的索引(从0开始计数),刚好可以匹配CSV读取后的数组下标,不需要手动写死索引值:
Scenario Outline: * def testData = read('classpath:com/testdata/Test.csv') # 合并当前CSV行数据与Examples自定义参数 * def callParams = testData[__num] * set callParams.gain = gain * set callParams.spend = spend * call read('classpath:controller/Controller.feature') callParams Examples: |gain |spend | |12000| 12008 | |3400 | 4655 |
方案2:CSV所有行与Examples所有行做笛卡尔积全量执行
如果你需要CSV的每一条数据都搭配Examples的每一组参数执行(即N行CSV × M行Examples产生N×M条用例),可以用以下两种写法任选其一:
写法A:调用时传入参数数组自动循环
Karate的call指令传入数组时会自动遍历数组的每一个元素,重复执行目标feature:
Scenario Outline: * def testData = read('classpath:com/testdata/Test.csv') # 给所有CSV行数据拼接当前Examples的自定义参数 * def callParams = karate.map(testData, function(row) { return karate.merge(row, {gain: gain, spend: spend}) }) * call read('classpath:controller/Controller.feature') callParams Examples: |gain |spend | |12000| 12008 | |3400 | 4655 |
写法B:预生成测试用例作为Examples数据源
直接把合并好的全量测试用例作为Examples的输入源,代码更简洁:
Background: * def csvData = read('classpath:com/testdata/Test.csv') * def customParams = [{gain:12000, spend:12008}, {gain:3400, spend:4655}] # 生成笛卡尔积测试用例数组 * def testCases = karate.map(csvData, csvRow => karate.map(customParams, customRow => karate.merge(csvRow, customRow)) ).flat() Scenario Outline: * call read('classpath:controller/Controller.feature') Examples: | testCases |
以上方案都不需要手动指定索引,可自动适配任意行数的CSV测试数据。
内容的提问来源于stack exchange,提问作者karateKid
相关产品推荐
相关产品推荐

