【保姆级】SpringBoot整合Cucumber(BDD) >>> part2

来一个简单的SpringBoot·查询接口·举个🌰吧~~

1. 添加依赖

<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>

    <groupId>cucumber</groupId>
    <artifactId>cucumber-java-skeleton</artifactId>
    <version>0.0.1</version>
    <packaging>jar</packaging>
    <name>Cucumber-Java Skeleton</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.junit</groupId>
                <artifactId>junit-bom</artifactId>
                <version>5.8.2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>io.cucumber</groupId>
                <artifactId>cucumber-bom</artifactId>
                <version>7.3.4</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-java</artifactId>
            <scope>test</scope>
        </dependency>
        
        <!-- integration with spring -->
        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-spring</artifactId>
        </dependency>

        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-junit-platform-engine</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-suite</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <scope>test</scope>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>2.3.12.RELEASE</version>
        </dependency>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>2.3.12.RELEASE</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.2</version>
        </dependency>

        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-jdbc</artifactId>
            <version>9.0.7</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.3.4</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.26</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>


    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.10.1</version>
                <configuration>
                    <encoding>UTF-8</encoding>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>3.0.0-M6</version>
                <configuration>
                    <properties>
                        <!-- Work around. Surefire does not include enough
                             information to disambiguate between different
                             examples and scenarios. -->
                        <configurationParameters>
                            cucumber.junit-platform.naming-strategy=long
                        </configurationParameters>
                    </properties>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

2. 添加各个层级的包以及相应功能的类

​完整代码

MyStarter.java

package com.aqin;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;

/**
 * @author aqin1012 AQin.
 * @date 2022/5/23 3:21 PM
 * @Version 1.0
 */
@SpringBootApplication
@MapperScan("com.aqin.dao.mapper")
public class MyStarter {
    public static void main(String[] args) {
        SpringApplication.run(MyStarter.class, args);
    }

    private final static String DATASOURCE_PREIFX = "spring.datasource";

    @Bean
    @ConfigurationProperties(prefix = DATASOURCE_PREIFX)
    public DataSource dataSource() {
        DriverManagerDataSource ret = new DriverManagerDataSource();
        ret.setDriverClassName("com.mysql.cj.jdbc.Driver");
        ret.setUsername("aqin1012");
        ret.setPassword("root");
        ret.setUrl("jdbc:mysql://127.0.0.1:3306/db_ras?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC");
        return ret;
    }

    @Bean
    public SqlSessionFactory sqlSessionFactoryBean() throws Exception {

        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource());

        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();

        sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath:/mapper/*.xml"));

        return sqlSessionFactoryBean.getObject();
    }

    @Bean
    public PlatformTransactionManager transactionManager() {
        return new DataSourceTransactionManager(dataSource());
    }
}

MyController.java

package com.aqin.controller;

import com.aqin.dao.domain.MyDO;
import com.aqin.service.MyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * @author aqin1012 AQin.
 * @date 2022/5/23 2:24 PM
 * @Version 1.0
 */
@RestController
@RequestMapping("/MyController")
public class MyController {
    @Autowired
    private MyService myService;


    @RequestMapping(value = "/getAllData", method = RequestMethod.GET)
    public String getAllData() {
        List<MyDO> allData = myService.getAllData();
        String result = "";
        for (MyDO my : allData) {
            result += my.toString();
        }
        return result;
    }
}

MyService.java

package com.aqin.service;

import com.aqin.dao.domain.MyDO;

import java.util.List;

/**
 * @author aqin1012 AQin.
 * @date 2022/5/23 2:24 PM
 * @Version 1.0
 */
public interface MyService {
    public List<MyDO> getAllData();
}

MyServiceImpl.java

package com.aqin.service.impl;

import com.aqin.dao.MyDao;
import com.aqin.dao.domain.MyDO;
import com.aqin.dao.mapper.MyMapper;
import com.aqin.service.MyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author aqin1012 AQin.
 * @date 2022/5/23 2:24 PM
 * @Version 1.0
 */
@Service
public class MyServiceImpl implements MyService {
    @Autowired
    private MyDao myDao;

    @Override
    public List<MyDO> getAllData() {
        List<MyDO> myDOList = myDao.getAllData();
        return myDOList;
    }
}

MyDao.java

package com.aqin.dao;

import com.aqin.dao.domain.MyDO;
import com.aqin.dao.mapper.MyMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * @author aqin1012 AQin.
 * @date 2022/5/23 2:25 PM
 * @Version 1.0
 */
@Repository
public class MyDao {
    @Autowired
    private MyMapper myMapper;

    public List<MyDO> getAllData() {
        return myMapper.getAllData();
    }

}

MyMapper.java

package com.aqin.dao.mapper;

import com.aqin.dao.domain.MyDO;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

/**
 * @author aqin1012 AQin.
 * @date 2022/5/23 2:25 PM
 * @Version 1.0
 */
@Mapper
public interface MyMapper {
    /**
     * get all the data from cockpit
     * @return
     */
    List<MyDO> getAllData();
}

MyDO.java

package com.aqin.dao.domain;

import lombok.Data;

import java.io.Serializable;
import java.util.Date;

/**
 * @author aqin1012 AQin.
 * @date 2022/5/23 3:04 PM
 * @Version 1.0
 */

@Data
public class MyDO implements Serializable {
    private Long id;

    private Date gmtModify;

    private Date gmtCreate;

    private Boolean deleteFlag;

    private Integer version;

    @Override
    public String toString() {
        return "MyDO{" +
                "id=" + id +
                '}';
    }
}

MyMapper.xml


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.aqin.dao.mapper.MyMapper">
    <resultMap id="BaseResultMap" type="com.aqin.dao.domain.MyDO">
        <id column="id" jdbcType="BIGINT" property="id"/>
        <result column="gmt_modify" jdbcType="TIMESTAMP" property="gmtModify"/>
        <result column="gmt_create" jdbcType="TIMESTAMP" property="gmtCreate"/>
        <result column="delete_flag" jdbcType="BOOLEAN" property="deleteFlag"/>
        <result column="version" jdbcType="INTEGER" property="version"/>
    </resultMap>

    <sql id="Base_Column_List">
        id, gmt_modify, gmt_create,
        delete_flag, version
    </sql>

    <select id="getAllData" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List"/>
        from table
    </select>
</mapper>

application.yml

server:
  port: 8082

3. 启动测试

1. 添加我们的cucumber test

2. 修改belly.feature文件(也可以把belly.feature删了,新建一个)

  • 修改文件名

  • 修改文件内容

Feature:test API
 Scenario: test API getAllData
   Given API getAllData
   When use this api
   Then return all data

常用关键字说明

  • Feature 整体功能描述(可以简单理解为起个名)

  • Scenario 描述一个场景

  • Given 描述初始状态

  • When 描述触发事件

  • Then 描述预期结果

希望详细学习的可以参考官方文档https://cucumber.io/docs/gherkin/reference/#example

3. 运行feature获取测试函数模版提示

PS:如果报错了,先看下面的报错处理 把3处红框框的内容复制到4处RunCucumberTest文件里(直接覆盖原先的官网用例测试即可)

​报错处理

CucumberBackendException

Testing started at 11:19 AM ...
五月 24, 2022 11:19:25 上午 io.cucumber.core.runtime.Runtime runFeatures
严重: Exception while executing pickle
java.util.concurrent.ExecutionException: io.cucumber.core.backend.CucumberBackendException: Please annotate a glue class with some context configuration.

For example:

   @CucumberContextConfiguration
   @SpringBootTest(classes = TestConfig.class)
   public class CucumberSpringConfiguration { }
Or: 

   @CucumberContextConfiguration
   @ContextConfiguration( ... )
   public class CucumberSpringConfiguration { }
        at java.util.concurrent.FutureTask.report(FutureTask.java:122)
        at java.util.concurrent.FutureTask.get(FutureTask.java:192)
        at io.cucumber.core.runtime.Runtime.runFeatures(Runtime.java:117)
        at io.cucumber.core.runtime.Runtime.lambda$run$0(Runtime.java:82)
        at io.cucumber.core.runtime.Runtime.execute(Runtime.java:94)
        at io.cucumber.core.runtime.Runtime.run(Runtime.java:80)
        at io.cucumber.core.cli.Main.run(Main.java:87)
        at io.cucumber.core.cli.Main.main(Main.java:30)
Caused by: io.cucumber.core.backend.CucumberBackendException: Please annotate a glue class with some context configuration.
......     
Before All/After All failed
io.cucumber.core.backend.CucumberBackendException: Please annotate a glue class with some context configuration.
......
0 Scenarios
0 Steps
0m0.557s
......
Process finished with exit code 1

解决方法

@Suite
@CucumberContextConfiguration
@IncludeEngines("cucumber")
@SelectClasspathResource("com/aqin")
@ConfigurationParameter(key = PLUGIN_PROPERTY_NAME, value = "pretty")
@ConfigurationParameter(key = GLUE_PROPERTY_NAME, value = "com.aqin")
public class RunCucumberTest {
}

4. 编写自己的测试代码

package com.aqin;

import com.aqin.controller.MyController;
import com.aqin.dao.MyDao;
import com.aqin.dao.domain.MyDO;
import com.aqin.service.MyService;
import io.cucumber.java.en.Given;
import io.cucumber.java.en.Then;
import io.cucumber.java.en.When;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.Assert;

import java.util.List;

public class StepDefinitions {

    @Autowired
    private MyController myController;

    @Autowired
    private MyService myService;

    @Autowired
    private MyDao myDao;

    String allDataController = "";
    String allDataService = "";
    String allDataDao = "";

    @Given("a API:getAllData")
    public void a_api_get_all_data() {
    }

    @When("I use API:getAllData")
    public void i_use_api_get_all_data() {
        allDataController = myController.getAllData();
        List<MyDO> allDataListService = myService.getAllData();
        if (allDataListService != null) {
            for (MyDO myDO : allDataListService) {
                allDataService += myDO.toString();
            }

        }
        List<MyDO> allDataListDao = myDao.getAllData();
        if (allDataListDao != null) {
            for (MyDO myDO : allDataListDao) {
                allDataDao += myDO.toString();
            }
        }
    }

    @Then("all the data")
    public void all_the_data() {
        Assert.isTrue(allDataController.equals(allDataService), "allDataController != allDataService");
        Assert.isTrue(allDataService.equals(allDataDao), "allDataService != allDataDao");
        Assert.isTrue(allDataController.equals(allDataDao), "allDataController != allDataDao");
    }
}

5. 运行

出现下图所示即为执行成功

​完成✅撒花🎉🎉🎉~~~

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AQin1012

求小鱼干呢~~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值