You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 02:52:56