BDD Cucumber 实战

cucumber

cucumber 是一个用于执行 BDD 的自动化测试工具。

用户指南

  1. 创建 Spring Boot 项目并引入依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.1.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    <groupId>org.zxd</groupId>
    <artifactId>behavior-driven-development-in-action</artifactId>
    <version>1.0.0</version>
    <name>behavior-driven-development-in-action</name>
    <description>behavior-driven-development-in-action</description>

    <properties>
        <java.version>1.8</java.version>
        <cucumber.version>4.2.0</cucumber.version>
    </properties>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>27.0-jre</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.8.1</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-collections4</artifactId>
            <version>4.2</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/io.cucumber/cucumber-java -->
        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-java</artifactId>
            <version>${cucumber.version}</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/io.cucumber/cucumber-java -->
        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-core</artifactId>
            <version>${cucumber.version}</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/io.cucumber/cucumber-java -->
        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-junit</artifactId>
            <version>${cucumber.version}</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/io.cucumber/cucumber-java -->
        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-spring</artifactId>
            <version>${cucumber.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>

            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
                <executions>
                    <execution>
                        <phase>integration-test</phase>
                        <goals>
                            <goal>java</goal>
                        </goals>
                        <configuration>
                            <classpathScope>test</classpathScope>
                            <mainClass>org.zxd.bdd.cucumber.CucumberTest.java</mainClass>
                            <arguments>
                                <argument>--plugin</argument>
                                <argument>pretty</argument>
                                <argument>--glue</argument>
                                <argument>src/test/resources/</argument>
                            </arguments>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>
  • 编写特性文件 TodoList.feature
#Author: zxd
#Keywords 概要
#Feature: 场景列表
#Scenario: 通过带有参数的步骤列表验证业务规则
#Given: 一些前置步骤
#When: 执行核心操作
#Then: 验证结果
#And,But: 列举更多的步骤
#Scenario Outline: 数据驱动的步骤列表
#Examples: Container for s table
#Background: 在每个场景之前运行的步骤列表
#""" (Doc Strings)
#| (Data Tables)
#@ (Tags/Labels):场景分组
#<> (placeholder)
#""
## (Comments)
#Sample Feature Definition Template
@tag
Feature: 任务特性
  
  @tag1
  Scenario Outline: 执行任务
    Given 任务列表有 <total> 个任务
    When 我完成了 <done> 个
    Then 任务列表还剩下 <left> 个任务
        Examples:
            | total | done | left |
            | 5         | 2      | 3        |
  • 实现该特性
@Builder
@Getter
public class TodoList {
    private int total;
    public void doTask(int count) {
        if (count > total || count < 0) {
            throw new IllegalArgumentException("count is invalid "+count);
        }
        total = total - count;
    }
}
  • 配置测试组件
@RunWith(Cucumber.class)
/**
 * features 用于指定特性文件的根目录
 * plugin 用于指定报告插件
 */
@CucumberOptions(features = "src/test/resources", plugin = { "pretty", "html:target/cucumber-report/",
"json:target/cucumber-report/cucumber.json" })
public class CucumberTest {
}

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = BehaviorDrivenDevelopmentInActionApplication.class)
@WebAppConfiguration
@SpringBootTest
public class BaseDefs{}
  • 编写测试规范
public class TodoListTest extends BaseDefs {
    TodoList todoList;

    @Given("^任务列表有 (\d+) 个任务$")
    public void given(int total) throws Throwable {
        todoList = TodoList.builder().total(total).build();
    }

    @When("^我完成了 (\d+) 个$")
    public void when(int done) throws Throwable {
        todoList.doTask(done);
    }

    @Then("^任务列表还剩下 (\d+) 个任务$")
    public void then(int left) throws Throwable {
        assertEquals(left, todoList.getTotal());
    }
}
  • 运行测试用例
选中 CucumberTest 运行测试并查看报告
原文地址:https://www.cnblogs.com/zhuxudong/p/10230059.html