Karate框架:如何将Scenario Outline变量引用至Examples段
Karate框架中Scenario Outline引用动态生成变量的解决方案
错误原因
你的写法逻辑完全颠倒了:Scenario Outline的执行顺序是先加载Examples中的数据,再执行Scenario内的步骤。你在Examples里引用的filtered是Scenario步骤中才会生成的变量,此时Karate还没执行到生成变量的步骤,自然会报ReferenceError: "filtered" is not defined。
正确实现思路
要把CSV过滤后的数据作为测试用例输入,必须先完成数据过滤操作,再将结果传入Scenario Outline的Examples。Karate提供两种常用实现方式:
方式1:动态生成Examples表格(拆分独立测试用例)
先在Background中完成CSV过滤,将结果转为表格格式,再通过karate.setup()动态注入到Examples中,这样每个过滤后的条目都会作为独立测试用例执行:
Background: * def data = read('test.csv') * def selected = 'TRUE' * def filterFun = function(x){ return x.Status == selected } * def filteredData = karate.filter(data, filterFun) # 将过滤后的数据转为Examples需要的二维数组格式 * def examplesData = karate.map(filteredData, function(item){ return [item] }) Scenario Outline: 处理过滤后的每条数据 * print "当前测试用例数据: ", __row # 这里可以添加你的业务逻辑,比如接口请求、断言等 * match <item> contains { Status: 'TRUE' } Examples: | item | | karate.setup(examplesData) |
方式2:循环处理过滤数据(不拆分测试用例)
如果不需要将每个过滤条目拆分为独立测试用例,直接在单个Scenario中用karate.forEach()循环处理即可:
Scenario: 批量处理过滤后的数据 * def data = read('test.csv') * def selected = 'TRUE' * def filterFun = function(x){ return x.Status == selected } * def filteredData = karate.filter(data, filterFun) * karate.forEach(filteredData, function(currentItem){ print "当前处理数据: ", currentItem # 插入你的业务逻辑,比如发送请求、验证响应等 * match currentItem.Status == 'TRUE' })
关键注意点
- Examples是Scenario Outline的输入源,必须在Scenario执行前就准备好数据,不能引用Scenario内部生成的变量。
- 动态生成Examples时,必须将数据转为二维数组格式(每个子数组对应一行用例数据),否则
karate.setup()无法识别。
内容的提问来源于stack exchange,提问作者sanjay pujari
相关产品推荐
相关产品推荐

