1. 引言

本文将介绍如何在Cucumber中有选择性地运行或跳过场景。

Cucumber是一个支持行为驱动开发(BDD)的工具。它能读取纯文本的可执行规范,并验证软件是否符合这些规范的要求。

2. 创建场景

先创建几个场景示例。以一个生成问候消息的API接口/greetings为例:

Feature: 基于时间的问候生成器
    # 早晨
    Scenario: 应在早晨返回"早上好"
        Given 当前时间是"0700"点
        When 我请求问候
        Then 应收到"Good Morning!"
    # 傍晚
    Scenario: 应在傍晚返回"晚上好"
        Given 当前时间是"1900"点
        When 我请求问候
        Then 应收到"Good Evening!"
    # 夜晚
    Scenario: 应在夜晚返回"晚安"
        Given 当前时间是"2300"点
        When 我请求问候
        Then 应收到"Good Night!"
    # 午夜
    Scenario: 应在午夜返回"晚安"
        Given 当前时间是"0000"点
        When 我请求问候
        Then 应收到"Good Night!"

接下来实现符合上述规范的控制器方法:

@GetMapping("/greetings")
@ResponseBody
public String greet(@RequestParam("hours") String hours) {
    String greeting;
    int currentHour = Integer.parseInt(hours.substring(0, 2));
    if (currentHour >= 6 && currentHour < 12) {
        greeting = "Good Morning!";
    } else if (currentHour >= 12 && currentHour < 16) {
        greeting = "Good Afternoon!";
    } else if (currentHour >= 16 && currentHour <= 19) {
        greeting = "Good Evening!";
    } else {
        greeting = "Good Night!";
    }
    return greeting;
}

3. 实现方式

现在看看如何忽略已定义的场景:

3.1. 使用自定义标签

通过为场景添加自定义标签(如@ignore@skip@disable)来控制执行。这里用@custom-ignore演示(实际建议使用有意义的名称)。

操作分两步:

  1. 标记需要忽略的场景
    给第三个场景添加标签:

    # 夜晚
    @custom-ignore
    Scenario: 应在夜晚返回"晚安"
        Given 当前时间是"2300"点
        When 我请求问候
        Then 应收到"Good Night!"
    
  2. 配置标签过滤器
    test/resources目录下的junit-platform.properties中添加:

    cucumber.filter.tags=not @custom-ignore
    

✅ 该场景在后续测试中将被跳过。

⚠️ 如果使用Junit4,需要在TestRunner类上使用@CucumberOptions注解:

@CucumberOptions(tags = "not @custom-ignore")

3.2. 注释场景

另一种简单粗暴的方式是直接注释整个场景:

# 夜晚
#  Scenario: 应在夜晚返回"晚安"
#      Given 当前时间是"2300"点
#      When 我请求问候
#      Then 应收到"Good Night!"

❌ 但这种方式容易出错,特别是需要处理多行注释时容易遗漏。

4. 结论

本文介绍了通过自定义标签可靠忽略Cucumber场景的方法。Cucumber的标签机制提供了灵活的场景标注和跳过能力。虽然存在其他方案(如注释),但基于标签的方式是官方推荐的最佳实践。


原始标题:How to Ignore Scenarios in Cucumber | Baeldung