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

通过Runner运行多feature文件时@parallel=false标签不生效咨询

Karate中@parallel=false标签未生效的问题排查与解决

当通过Runner执行文件夹内的一组feature文件时,@parallel=false标签未被正确识别,各feature文件仍以并行方式运行。请问除了将Runner设置为仅单线程执行外,是否有其他解决办法?这是否属于Bug?


问题示例feature文件

Device完整流程

Feature: Test flow for all v1 device endpoints
  Background: Test setup including authentication, pre-reqs (if any), constants, and logout settings 
    * if (skipdomain == true) { karate.logger.debug('skipDomain is set to ' + skipdomain + ' so Domain calls cannot be ran!'); karate.abort(); }

    * def dataSourceRow = karate.get('karate.properties["karate.dsRow"]', 1)
    * callonce read('../../../../constants.feature') 

    * url baseUrlDomain + domainPath
    * configure headers = headers.domain_headers
    * header host = domainHost
    
    * def endpoint = 'various'
    * def endpointMethod = 'multiple'

    @smoke @parallel=false
  Scenario: Scenario for endpoint

DHCP完整流程

@domain @regression @hopper @parallel=false
Feature: Test flow for all v1 dhcp reservation endpoints
  Background: Test setup including authentication, pre-reqs (if any), constants, and logout settings 
    * if (skipdomain == true) { karate.logger.debug('skipDomain is set to ' + skipdomain + ' so Domain calls cannot be ran!'); karate.abort(); }

    * def dataSourceRow = karate.get('karate.properties["karate.dsRow"]', 1)
    * callonce read('../../../../constants.feature') 

    * url baseUrlDomain + domainPath
    * configure headers = headers.domain_headers
    * header host = domainHost
    
    * def endpoint = 'various'
    * def endpointMethod = 'multiple'

    * def randomNumber = function(min, max){ return Math.floor( Math.random() * ( max - min + 1 ) + min ) }
    * def DateTime = Java.type('commonutilhelpers.DateTime')
    * def timestamp = DateTime.doWorkStatic('MM/dd/yyyy HH:mm', '0')

    * def deleteDHCP =  
    """
    function(dhcpReservation){
      karate.call('this:referenceTests/DeviceDhcpReservation-DELETE.feature', { curDeviceId: dhcpReservation.macAddress});
    }
    """

    @smoke
  Scenario: Scenario for endpoint

Groups完整流程

@domain @regression @hopper
Feature: Test flow for all v1 group(s) endpoints
  Background: Test setup including authentication, pre-reqs (if any), constants, and logout settings 
    * if (skipdomain == true) { karate.logger.debug('skipDomain is set to ' + skipdomain + ' so Domain calls cannot be ran!'); karate.abort(); }

    * def dataSourceRow = karate.get('karate.properties["karate.dsRow"]', 1)
    * callonce read('../../../../constants.feature') 

    * url baseUrlDomain + domainPath
    * configure headers = headers.domain_headers
    * header host = domainHost
    
    * def endpoint = 'various'
    * def endpointMethod = 'multiple'

    * def deleteGroup =  
    """
    function(group){
      karate.call('this:referenceTests/GroupsById-DELETE.feature', { groupId: group.id});
    }
    """

    @smoke @parallel=false
  Scenario: Scenario for endpoint

执行现象

执行时间线显示这些feature/场景并未串行执行,而是在4、5、6线程中并行运行:
执行时间线报告


解决办法与问题分析

1. 修正标签位置(核心问题)

Karate对@parallel=false标签的位置有严格要求:

  • 标签必须直接放在Feature或Scenario的上方,无额外缩进
  • 放在Feature上方:控制整个feature文件串行执行
  • 放在Scenario上方:控制单个Scenario串行执行

你的示例中标签要么缩进错误,要么位置偏移(比如DHCP流程的标签放在Feature定义前且有缩进),导致Karate无法识别。修正后的DHCP流程示例:

@domain @regression @hopper @parallel=false
Feature: Test flow for all v1 dhcp reservation endpoints
  Background: Test setup including authentication, pre-reqs (if any), constants, and logout settings 
    * if (skipdomain == true) { karate.logger.debug('skipDomain is set to ' + skipdomain + ' so Domain calls cannot be ran!'); karate.abort(); }
    # 其余背景步骤保持不变

  @smoke
  Scenario: Scenario for endpoint
    # 场景步骤保持不变

2. 调整Runner配置

如果Runner中强制设置了并行线程数(比如parallel(5)),会覆盖feature级别的标签配置。可以拆分Runner执行:

  • 先运行带@parallel=false的用例,关闭并行:
    Runner.path("classpath:features").tags("@parallel=false").parallel(1);
    
  • 再运行其余用例,开启并行:
    Runner.path("classpath:features").tags("~@parallel=false").parallel(3);
    

3. 升级Karate版本

旧版本Karate(如1.0.x以前)可能存在标签识别的bug,建议升级到最新稳定版本(当前推荐1.4.1+),新版本对并行控制的逻辑更严谨。

是否属于Bug?

从你的示例来看,核心问题是标签位置不符合规范,不属于Karate的Bug。如果已经修正标签位置、Runner配置无强制覆盖,且使用最新版本仍出现并行执行的情况,那才可能是Bug,此时可以到Karate的GitHub仓库提交Issue并附复现步骤。


内容的提问来源于stack exchange,提问作者mike

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 20:50:21