Karate中复用多场景公共Feature文件,如何避免重复调用且报告场景独立?
解决Karate多微服务公共测试的两个弊端
方案1:抽离公共测试入口 + 优化报告展示
解决重复调用问题
创建一个统一的公共测试入口文件(比如common-tests-runner.feature),把所有需要执行的公共Feature调用集中在这里:
Feature: 公共测试统一入口 Scenario: 执行CRUD通用测试 * call read('common-cru.feature') Scenario: 执行错误处理通用测试 * call read('common-errors.feature')
之后每个微服务的包装器文件只需要调用这个入口,不用重复编写所有公共Feature的调用逻辑:
Feature: microservice1 服务测试 Background: * def authLevelCde = "ACL_FORE_DEFAULT" * def serviceName = "microservice1" # 按需添加该微服务特有的自定义属性 Scenario: 执行所有通用测试 * call read('common-tests-runner.feature')
这样每个包装器只需要维护自身的属性配置,公共测试集合的变更只需要修改入口文件即可。
解决报告合并问题
公共Feature的多个Scenario被合并显示,是因为它们被包裹在一个父Scenario中调用。要让每个公共Scenario在报告里独立展示,只需要确保入口文件里的每个调用对应独立的Scenario——当微服务包装器调用入口文件时,Karate会把入口里的每个Scenario作为独立测试步骤在报告中展开。
另外可以配置Karate报告显示所有子步骤,确保细节完整:
Background: * configure report = { showAllSteps: true } * def authLevelCde = "ACL_FORE_DEFAULT" * def serviceName = "microservice1"
方案2:参数化主Feature + 数据驱动(彻底消除包装器)
这个方案无需为每个微服务编写包装器,通过集中配置+数据驱动实现统一测试,同时解决两个弊端。
步骤1:创建微服务配置文件
比如microservices-config.json,集中管理所有微服务的属性:
[ { "serviceName": "microservice1", "authLevelCde": "ACL_FORE_DEFAULT", "basePath": "/api/microservice1" }, { "serviceName": "microservice2", "authLevelCde": "ACL_FLD_DEFAULT", "basePath": "/api/microservice2", "customProp": "extra-value" } ]
步骤2:编写主测试Feature
Feature: 所有微服务通用测试 Background: * def configs = read('microservices-config.json') * configure parallel = 5 # 设置并行执行线程数 Scenario Outline: 针对<serviceName>执行通用测试 * def serviceConfig = <config> # 注入当前微服务的属性到上下文 * def authLevelCde = serviceConfig.authLevelCde * def serviceName = serviceConfig.serviceName * def baseUrl = baseUrl + serviceConfig.basePath # 按需注入自定义属性 * if (serviceConfig.customProp) def customProp = serviceConfig.customProp # 逐个调用公共Feature,确保报告中独立显示每个测试场景 * call read('common-cru.feature') * call read('common-errors.feature') Examples: | config | | configs |
执行命令
直接运行主Feature文件即可:
java -cp ../karate-1.3.0/karate.jar:.. com.intuit.karate.Main main-tests.feature
这个方案的优势:
- 无需维护多个包装器,所有微服务配置集中管理
- 每个微服务的每个公共Scenario都会在报告中独立显示
- 天然支持并行执行,通过
configure parallel控制并发数
补充优化
如果需要批量调用多个公共Feature,可以用call each简化代码:
* def commonFeatures = ['common-cru.feature', 'common-errors.feature'] * call each commonFeatures read('#(this)')
内容的提问来源于stack exchange,提问作者Jon Detert
相关产品推荐
相关产品推荐

