将Cumber与Gradle结合使用

2025/04/30

1. 简介

Cucumber是一款支持行为驱动开发(BDD)的测试自动化工具,它运行以纯文本Gherkin语法编写的规范,该规范描述了系统行为。

在本教程中,我们将了解将Cucumber与Gradle集成的几种方法,以便在项目构建过程中运行BDD规范。

2. 设置

首先,让我们使用Gradle Wrapper建立一个Gradle项目。

接下来,我们将cucumber-java依赖添加到build.gradle:

testImplementation 'io.cucumber:cucumber-java:6.10.4'

这会将官方的Cucumber Java实现添加到我们的项目中。

3. 使用自定义任务运行

为了使用Gradle运行我们的规范,我们将创建一个使用Cucumber的命令行界面运行器(CLI)的任务

3.1 配置

让我们首先将所需的配置添加到项目的build.gradle文件中:

configurations {
    cucumberRuntime {
        extendsFrom testImplementation
    }
}

接下来,我们将创建自定义cucumberCli任务:

task cucumberCli() {
    dependsOn assemble, testClasses
    doLast {
        javaexec {
            main = "io.cucumber.core.cli.Main"
            classpath = configurations.cucumberRuntime + sourceSets.main.output + sourceSets.test.output
            args = [
                '--plugin', 'pretty',
                '--plugin', 'html:target/cucumber-report.html', 
                '--glue', 'cn.tuyucheng.taketoday.cucumber', 
                'src/test/resources']
        }
    }
}

此任务配置为运行src/test/resources目录下的.feature文件中找到的所有测试场景。

Main类的–glue选项指定运行场景所需的步骤定义文件的位置。

–plugin选项指定测试报告的格式和位置,我们可以组合多个值来生成所需格式的报告,例如本例中的pretty和HTML格式。

还有其他几个可用选项,例如,有一些选项可以根据名称和标签过滤测试。

3.2 场景

现在,让我们在src/test/resources/features/account_credited.feature文件中为我们的应用程序创建一个简单的场景:

Feature: Account is credited with amount

    Scenario: Credit amount
        Given account balance is 0.0
        When the account is credited with 10.0
        Then account should have a balance of 10.0

接下来,我们将实现运行场景所需的相应步骤定义:

public class StepDefinitions {

    @Given("account balance is {double}")
    public void givenAccountBalance(Double initialBalance) {
        account = new Account(initialBalance);
    }

    // other step definitions
}

3.3 运行任务

最后,让我们从命令行运行cucumberCli任务:

>> ./gradlew cucumberCli

> Task :cucumberCli

Scenario: Credit amount                      # src/test/resources/features/account_credited.feature:3
  Given account balance is 0.0               # cn.tuyucheng.taketoday.cucumber.StepDefinitions.account_balance_is(java.lang.Double)
  When the account is credited with 10.0     # cn.tuyucheng.taketoday.cucumber.StepDefinitions.the_account_is_credited_with(java.lang.Double)
  Then account should have a balance of 10.0 # cn.tuyucheng.taketoday.cucumber.StepDefinitions.account_should_have_a_balance_of(java.lang.Double)

1 Scenarios (1 passed)
3 Steps (3 passed)
0m0.381s

可以看到,我们的规范已与Gradle集成,并成功运行,输出已显示在控制台上。此外,HTML测试报告也可在指定位置获取。

4. 使用JUnit运行

我们可以使用JUnit来运行Cucumber场景,而不是在Gradle中创建自定义任务。

让我们首先包含cucumber-junit依赖:

testImplementation 'io.cucumber:cucumber-junit:6.10.4'

由于我们使用的是JUnit 5,因此我们还需要添加junit-vintage-engine依赖:

testImplementation 'org.junit.vintage:junit-vintage-engine:5.7.2'

接下来,我们将在测试源位置创建一个空的运行器类:

@RunWith(Cucumber.class)
@CucumberOptions(
        plugin = {"pretty", "html:target/cucumber-report.html"},
        features = {"src/test/resources"}
)
public class RunCucumberTest {
}

这里,我们在@RunWith注解中使用了JUnit Cucumber运行器,此外,所有CLI运行器选项(例如features和plugin)都可以通过@CucumberOptions注解使用。

现在,执行标准Gradle test任务将查找并运行所有功能测试,以及任何其他单元测试:

>> ./gradlew test

> Task :test

RunCucumberTest > Credit amount PASSED

BUILD SUCCESSFUL in 2s

5. 使用插件运行

最后一种方法是使用第三方插件,该插件提供从Gradle构建运行规范的能力

在我们的示例中,我们将使用gradle-cucumber-runner插件来运行Cucumber JVM,它会将所有调用转发到我们之前使用的CLI运行器,让我们将它添加到我们的项目中:

plugins {
    id "se.thinkcode.cucumber-runner" version "0.0.8"
}

这会将Cucumber任务添加到我们的构建中,现在我们可以使用默认设置运行它:

>> ./gradlew cucumber

值得注意的是,这不是官方的Cucumber插件,还有其他插件可以提供类似的功能。

6. 总结

在本文中,我们演示了使用Gradle配置和运行BDD规范的几种方法。

首先,我们研究了如何使用CLI运行器创建自定义任务。然后,我们研究了如何使用Cucumber JUnit运行器通过现有的Gradle任务执行规范。最后,我们使用第三方插件来运行Cucumber,而无需创建自定义任务。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章