Karate框架调用含Scenario Outline的feature文件时循环执行失败
解决Karate框架中调用含Scenario Outline的Feature文件循环失败问题
我来帮你搞定这个Karate里的调用循环问题~先分析下为啥会失败,再给你对应的解决方案。
问题根源
你现在的写法会触发双重循环:
calling.feature里的Examples有2条数据,会循环调用called.feature2次- 但
called.feature本身是Scenario Outline,自带2条Examples,每次被调用时都会自动执行完自己的所有Examples条目
这样一来,实际会执行 2×2=4 次验证,其中当传入的<arg>和called.feature的<arg2>不匹配时(比如传入HELLO却要验证WORLD),就会出现匹配失败的情况。
解决方案
根据你的需求,推荐两种方案,第一种最直接:
方案一:将called.feature改为普通Scenario(推荐)
既然你的核心需求是从calling.feature传递参数给called.feature做验证,那called.feature完全不需要自己的Scenario Outline和Examples,改成普通Scenario即可:
修改后的called.feature:
Feature: 在Karate框架中测试循环 Scenario: 验证调用传入的参数 * def callingArg = arg * match callingArg == arg # 直接验证传入的参数,确保和调用时传递的一致
如果需要更明确的预期值验证,也可以让calling.feature同时传递参数和预期值:
修改后的calling.feature:
Feature: 测试通过调用feature文件实现循环 Scenario Outline: 测试循环调用feature文件 * call read('called.feature') { input: '<arg>', expected: '<expected>' } Examples: |arg |expected | |"HELLO" |"HELLO" | |"WORLD" |"WORLD" |
对应的called.feature:
Feature: 在Karate框架中测试循环 Scenario: 验证调用传入的参数 * match input == expected
这样每次调用只会执行1次验证,总共执行2次,完全符合你的循环需求,不会出现匹配失败。
方案二:保留Scenario Outline,通过call传递测试数据
如果确实需要called.feature保留Scenario Outline,可以在调用时传入完整的测试数据,覆盖掉它自带的Examples:
修改后的calling.feature:
Feature: 测试通过调用feature文件实现循环 Scenario: 调用带Scenario Outline的feature并传递数据 * def testCases = [{ arg2: "HELLO" }, { arg2: "WORLD" }] * call read('called.feature') testCases
called.feature可以保留原结构(但自带的Examples会被传入的testCases覆盖):
Feature: 在Karate框架中测试循环 Scenario Outline: 测试循环执行feature * match '<arg2>' == arg2 Examples: |arg2| # 这里的示例会被调用时传入的testCases替换
这种方式适合需要动态生成测试数据的场景,但对你当前的需求来说,方案一更简洁直接。
内容的提问来源于stack exchange,提问作者Rakesh Mahendrakar
相关产品推荐
相关产品推荐

