一、简介

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', 'com.baeldung.cucumber', 
              'src/test/resources']
        }
    }
}

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

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

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

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

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               # com.baeldung.cucumber.StepDefinitions.account_balance_is(java.lang.Double)
  When the account is credited with 10.0     # com.baeldung.cucumber.StepDefinitions.the_account_is_credited_with(java.lang.Double)
  Then account should have a balance of 10.0 # com.baeldung.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 运行程序选项(例如 featuresplugin )都可以通过 @CucumberOptions 注释获得。

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

>> ./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 插件 ,还有其他提供类似功能的插件。

六,结论

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

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

与往常一样,完整的源代码可以在 GitHub 上找到。