记Cucumber行为驱动测试的简单配置与使用方式

产生背景

代码测试的工具有很多,比如最常用的单元测试工具Junit、Jupiter、Mockito和PowerMockito,这几个可以说是Java开发者的心头好,代码测试一般都是用这几个里面的某一个或者一组(Mockito和PowerMockito)结合进行使用,现在代码测试的问题可以很好的得到解决,但是新的问题又产生了,这里的问题不是指代码是否有缺陷的问题,而是说随着用户群体的扩大,可能有些并不怎么接触代码的人(比如产品和甲方)想亲眼看到孵化的产品安全性是否可靠、健壮性是否够足够,这个时候就要求开发人员能写一些他们看得懂的测试用例并给出对应的测试报告;在这种情况下,cucumber应运而生了。

cucumber简介

cucumber是BDD(Behavior-driven development,行为驱动开发)的一个自动化测试框架产品,cucumber使用自然语言来描述测试,通过设置中文描述可以连通业务人员和开发人员,使得需求清晰明了,进而消除两种角色之间理解上的差异——功能上和需求上。

牛刀小试

此处使用springboot项目进行简单的cucumber编写与测试,各种相关cucumber的知识会在下面的步骤中一一具体说明;

pom配置

 <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-java8</artifactId>
            <version>4.2.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-junit</artifactId>
            <version>4.2.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-spring</artifactId>
            <version>4.2.0</version>
            <scope>test</scope>
        </dependency>

待测试Controller接口

@RestController
@RequestMapping("api")
public class WebSocketController {
    @Autowired
    private WebSocketService webSocketService;

    @GetMapping("name")
    public String getName() {
        return webSocketService.getName();//返回 查询成功 字段
  }
}

编写feature

根据业务需求,在src/test/resources目录下新建features文件夹管理.feature文件,在src/test/java目录下撰写每一个step对应的步骤定义java文件。

需要注意的是,cucumber可以支持多种语言,包括中文。本文仅介绍中文实现方式,中文实现方式在feature文件中加入:

# language:zh-CN

 

编写feature对应BDD文件

public class GetNameBDD {
    private String BASE_URL = "http://localhost:8081";
    private String URL = null;
    private String result = null;

    @假定("将要调用获取name接口")
    public void getNamePrepare() {
        URL = BASE_URL + "/api/name";
    }

    @当("获取了name")
    public void hadGetName() {
        TestRestTemplate testRestTemplate = new TestRestTemplate();
        result = testRestTemplate.getForObject(URL, String.class);
    }

    @并且("name是{string}")
    public void judge(String nameStr) {
        assert nameStr.equals(result);
    }

    @那么("执行成功")
    public void success() {
        System.out.println("测试结果正常");
    }

}

编写测试类

@RunWith(Cucumber.class)//以cucumber的方式运行测试文件
@CucumberOptions(
        monochrome = true,//详细显示运行结果
        plugin = {"pretty",
                "json:target/cucumber-report/json-files/cucumber.json",
                "html:target/cucumber-report/cucumber.html"},//生成本地json和html测试报告
        features = "src/test/resources/features")//feature文件存放位置
public class CucumberTest { }

 

运行测试

上面的做完以后运行测试就很简单了,首先把项目正常启动起来(测试的本质是接口的调用),之后运行CucumberTest文件,就能得到如下测试结果;

其中需要注意的是,Scenarios就是我们说的场景,Step就是我们在场景下编写的那些行文字,每个step都有BDD方法与之唯一对应;

测试报告

测试报告生成在target/cucumber-report下

posted @ 2023-02-24 08:03  HexThinking  阅读(294)  评论(0编辑  收藏  举报