Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Spring Boot+cucumber

Spring Boot+cucumber

作者头像
顾翔
发布于 2024-09-10 06:07:13
发布于 2024-09-10 06:07:13
12300
代码可运行
举报
运行总次数:0
代码可运行

简单案例

首先来看一个简单的案例

1 使用start.spring.io创建一个“web”项目。在“依赖项”对话框中搜索并添加“web”依赖项,如屏幕截图所示。点击“生成”按钮,下载zip,并将其解压缩到计算机上的文件夹中。

2 修改pom.xml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0"
encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
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.3.1.RELEASE</version>
</parent>
<groupId>com.example</groupId>
<artifactId>com.example</artifactId>
<version>1.0.0-SNAPSHOT</version>
<properties>
<java.version>11</java.version>
<cucumber.version>6.8.1</cucumber.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<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>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-java</artifactId>
<version>${cucumber.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-spring</artifactId>
<version>${cucumber.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-junit-platform-engine</artifactId>
<version>${cucumber.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

目录结构如下图

Hello.feature

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Feature: Hello world
           
  Scenario: Calling a rest end point
* the application says hello

HelloController.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.example.BDDSpring;
           
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
public class Application {
    @RestController
    public static class HelloController {
        @RequestMapping("/")
        public String local() {
            return "Greetings from Local!";
        }
    }
}

HelloController.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.example.BDDSpring;
           
import io.cucumber.java.en.Given;
import io.cucumber.junit.platform.engine.Cucumber;    
import io.cucumber.spring.CucumberContextConfiguration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;
           
import static org.hamcrest.CoreMatchers.equalTo;
import static org.springframework.http.MediaType.APPLICATION_JSON;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
           
@Cucumber
@CucumberContextConfiguration    
@SpringBootTest
@AutoConfigureMockMvc
public class CucumberTest {
    @Autowired
    private MockMvc mvc;
    @Given("the application says hello")
    public void getLocalHello() throws Exception {
           mvc.perform(get("/").accept(APPLICATION_JSON))
                .andExpect(status().isOk())
                .andExpect(content().string(equalTo("Greetings from Local!")));
    }
}

用JUnit运行HelloController.java,测试成功

二 一个正式的案例

1 使用start.spring.io创建一个“web”项目。在“依赖项”对话框中搜索并添加“web”依赖项,为了后面的契约文件,再加入“Config Client ”和“Contract Stub Runner依赖项。如屏幕截图所示。点击“生成”按钮,下载zip,并将其解压缩到计算机上的文件夹中。

2 pom.xml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<project
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
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.3.1.RELEASE</version>
</parent>
<groupId>com.example</groupId>
<artifactId>com.example</artifactId>
<version>1.0.0-SNAPSHOT</version>
<properties>
<java.version>11</java.version>
<cucumber.version>6.8.1</cucumber.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<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>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-java</artifactId>
<version>${cucumber.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-spring</artifactId>
<version>${cucumber.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-junit-platform-engine</artifactId>
<version>${cucumber.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

3 目录结构如下

4 ATMService.feature

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# language: zh-CN
功能:验证密码
作为银行储户
我想要在 ATM 上验证密码
以便我可以安全地进行操作
场景:查询余额
假如储户拥有一张卡号为"1111222233"的借记卡    
并且密码为"123456"
并且储户借记卡账户余额为"100.00"元
当储户将卡插入ATM
并且储户选择查询余额
那么提示储户输入密码
并且输入密码"123456"
那么储户可以看到自己的余额"100.00"场景:查询余额密码验证不通过
假如储户拥有一张卡号为"1111222233"的借记卡
并且密码为"123456"
并且储户借记卡账户余额为"100.00"元
当储户将卡插入ATM
并且储户选择查询余额
那么提示储户输入密码
并且输入密码"456987"
那么储户可以看到密码错误的提示

5 先来看看测试文件

MyDemoApplicationTests.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.example.ATMService;
           
import io.cucumber.junit.platform.engine.Cucumber;    
import io.cucumber.spring.CucumberContextConfiguration;
           
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
           
@Cucumber
@CucumberContextConfiguration
@SpringBootTest
class MyDemoApplicationTests {
       @Test
       void contextLoads() {
       }
}

VerifyPINStepDefinitions.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.example.ATMService;
           
import com.example.ATMService.domain.model.Account;
import com.example.ATMService.domain.model.DebitCard;
import com.example.ATMService.performer.ATM;
import com.example.ATMService.performer.Customer;
import io.cucumber.java.zh_cn.假如;
import io.cucumber.java.zh_cn.;    
import io.cucumber.java.zh_cn.那么;
import io.cucumber.junit.platform.engine.Cucumber;
           
import static org.junit.Assert.assertEquals;
           
import org.springframework.boot.test.context.SpringBootTest;
           
@Cucumber
@SpringBootTest
public class VerifyPINStepDefinitions {
       private final Customer customer = new Customer();
       private final ATM atm = new ATM();
       @假如("储户拥有一张卡号为\"{int}\"的借记卡")
       public void 储户拥有一张卡号为_的借记卡(Integer cardIdInteger){
              Long cardId = cardIdInteger.longValue();
              this.customer.haveCard(new DebitCard(cardId));
       }
       
       @假如("密码为\"{int}\"")
       public void 密码为(Integer PIN){
              this.customer.setDebitCardPIN(PIN);
       }    
       
       @假如("储户借记卡账户余额为\"{double}\"元")
       public void 储户借记卡账户余额为_元(Double balance){
              this.customer.setCardAccount(new Account(balance));
       }
       
       @("储户将卡插入ATM")
       public void 储户将卡插入atm(){
              this.customer.insertCardToATM(atm);
       }
                     
       @("储户选择查询余额")
       public void 储户选择查询余额(){
              this.customer.queryBalanceOn(atm);
       }
       
       @那么("提示储户输入密码")
       public void 提示储户输入密码(){
              assertEquals("Please input PIN:", this.atm.getScreenMessage());
       }
       
       @那么("输入密码\"{int}\"")    
       public void 输入密码(Integer pin){
              this.customer.enterPIN(this.atm, pin);
       }
              
       @那么("储户可以看到自己的余额\"{double}\"元")
       public void 储户可以看到自己的余额_元(Double balance){
              assertEquals(String.format("Your balance is: %,f", balance), this.atm.getScreenMessage());
       }
       
       @那么("储户可以看到密码错误的提示")
       public void 储户可以看到密码错误的提示(){
              assertEquals("your PIN is invalid.", this.atm.getScreenMessage());
       }
}

现在再来完成产品文件

com.example.ATMService目录下AtmServiveApplication.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.example.ATMService;
           
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
               
@SpringBootApplication
public class AtmServiveApplication {
           
       public static void main(String[] args) {
              SpringApplication.run(AtmServiveApplication.class, args);
       }
}

com.example.ATMService.domain.model目录下Account.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.example.ATMService.domain.model;
           
public class Account {
       private final Double balance;
       public Account(Double balance) {
              this.balance = balance;
       }
       public double getBalance() {
              return balance;
       }
}

com.example.ATMService.domain.model目录下DebitCard.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.example.ATMService.domain.model;
               
public class DebitCard {
       private Integer PIN= -1;
       private final Long cardId;
       private Account account;
       
       public DebitCard(Long cardId){
              this.cardId = cardId;
       }
       
       public void setPIN(Integer pin){
              this.PIN = pin.intValue();
       }
       
       public void setAccount(Account account) {
              this.account = account;
       }
       
       public double getBalance() {
              return this.account.getBalance();
       }
       
       public boolean verifyPIN(Integer pin) {    
              return this.PIN.intValue()== pin;
       }
           
       public Long getCardID() {
              return this.cardId;
       }
}

com.example.ATMService.domain.service目录下DebitCardService.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.example.ATMService.domain.service;
           
public class DebitCardService {
       public boolean verifyPIN(Long cardID, Integer pin){
              return pin == 123456;
       }
}

com.example.ATMService.performer目录下ATM.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.example.ATMService.performer;
           
import com.example.ATMService.domain.model.DebitCard;
import com.example.ATMService.domain.service.DebitCardService;
           
public class ATM {    
       private DebitCard card;
       private String screenMessage;
       private boolean verifiedPIN = false;
       private DebitCardService debitCardService = new DebitCardService();
       public void insertCard(DebitCard debitCard) {
              this.card = debitCard;
       }
       
       public void queryBalance() {
              if(this.verifiedPIN){
                     this.screenMessage = String.format("Your balance is: %f", this.card.getBalance());
              }else {
                     this.screenMessage = String.format("Please input PIN:");
              }
       }
       
       public String getScreenMessage() {
              return this.screenMessage;
       }
       
       public void enterPlN(Integer pin) {    
              this.verifiedPIN = this.debitCardService.verifyPIN(this.card.getCardID(), pin);
              if (!this.verifiedPIN) {
                     this.screenMessage ="your PIN is invalid.";
              }else {
                     this.queryBalance();
              }
       }
}

com.example.ATMService.performer目录下Customer.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.example.ATMService.performer;
           
import com.example.ATMService.domain.model.Account;
import com.example.ATMService.domain.model.DebitCard;
           
public class Customer {
       private DebitCard debitCard;
       public void haveCard(DebitCard debitCard) {
              this.debitCard = debitCard;
       }
       public void setDebitCardPIN(Integer pin){
              this.debitCard.setPIN(pin);    
       }
       public void setCardAccount(Account account) {
              this.debitCard.setAccount(account);
       }
       
       public void insertCardToATM(ATM atm){
              atm.insertCard(this.debitCard);
       }
              
       public void queryBalanceOn(ATM atm) {
              atm.queryBalance();
       }
              
       public void enterPIN(ATM atm, Integer pin) {
              atm.enterPlN(pin);
       }
}

6用JUnit运行VerifyPINStepDefinitions.Java

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-02-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spring Boot+cucumber+契约测试
1.使用start.spring.io创建一个“web”项目。在“依赖项”对话框中搜索并添加“web”依赖项,为了后面的契约文件,再加入“Config Client ”和“Contract Stub Runner依赖项。点击“生成”按钮,下载zip,并将其解压缩到计算机上的文件夹中。
顾翔
2024/09/10
1170
Spring Boot+cucumber+契约测试
如何在Eciipse建立cucumber项目
features = "src/test/java/hellocucumber/test.feature"指明feature文件位置
顾翔
2024/09/10
1170
如何在Eciipse建立cucumber项目
敏捷测试价值观、方法和实践读书笔记(7)
features = "src/test/java/hellocucumber/test.feature"指明feature文件位置
顾翔
2024/09/10
1190
敏捷测试价值观、方法和实践读书笔记(7)
使用Spring Boot 2.X构建RESTful服务
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的创建、运行、调试、部署等。它大大减少了基于Spring开发的生产级应用程序的工作量。因此,开发人员能够真正专注于以业务为中心的功能。
java干货
2021/02/19
1.5K0
使用Spring Boot 2.X构建RESTful服务
Spring boot with Spring security
本文节选自 《Netkiller Java 手札》 地址:http://www.netkiller.cn/java/index.html 9.15. Spring boot with Spring security 9.15.1. Maven <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency
netkiller old
2018/03/05
1.2K0
_Spring事务简介及相关案例
此时没有事务管理,会造成张三的余额减少,而李四的余额并没有增加。所以事务处理位于业务层,即一个service方法是不能分割的。 因此下一篇文章我们会学习到事务管理方案。一步步深入学习,期待大家的支持啊。
会洗碗的CV工程师
2023/11/19
1650
_Spring事务简介及相关案例
一文让你了解微服务契约测试
谈到微服务,大家都想到契约测试,到底什么是契约测试呢,为什么要使用契约测试呢,关于这样的文章很多,本文将结合Spring Boot让你了解微服务契约测试。
顾翔
2024/09/10
1460
一文让你了解微服务契约测试
bddExcel for Java
本文介绍如何使用Java建立bddExcel实现BDD,注意bddExcel没有用到Cucumber。
顾翔
2024/09/10
1100
bddExcel for Java
springclound快速入门
一、开始使用springcloud实战微服务 1.工具及软件版本选择 jdk 1.8 springboot 1.5.9 springcloud edgware springtool suite /
微醺
2019/01/17
8390
分布式事务TCC框架-hmily(spring cloud feign)
1、采用disruptor进行事务日志的异步读写(disruptor是一个无锁,无GC的并发编程框架)
全栈程序员站长
2022/08/31
8040
分布式事务TCC框架-hmily(spring cloud feign)
Spring事务简介及相关案例
会洗碗的CV工程师
2023/10/14
2620
Spring事务简介及相关案例
【Spring Boot】010-Spring Boot整合Mybatis
链接:https://pan.baidu.com/s/17YUn1yEA-U4Ju-a20EjuFg 提取码:zibo
訾博ZiBo
2025/01/06
460
【Spring Boot】010-Spring Boot整合Mybatis
【Spring Boot】013-Spring Boot整合Shiro环境搭建
訾博ZiBo
2025/01/06
1330
【Spring Boot】013-Spring Boot整合Shiro环境搭建
Spring Cloud Alibaba 系列之 Seata 分布式事务 demo
  在上一篇博客 《Spring Cloud Alibaba 系列之 Seata 介绍》 介绍了 Seata,在这一篇中我们来看看怎么使用。以一个用户购买商品的微服务示例开始,整个业务逻辑由3个微服务提供支持:仓储服务:对给定的商品扣除仓储数量。订单服务:根据采购需求创建订单。帐户服务:从用户帐户中扣除余额。
Demo_Null
2020/12/07
1.3K0
Spring Cloud Alibaba 系列之 Seata 分布式事务 demo
SpringBoot 快速开启事务(附常见坑点)「建议收藏」
以操作账户金额为例,模拟正常操作金额提交事务,以及发生异常回滚事务。其中控制层代码如下:
全栈程序员站长
2022/07/20
1.6K0
SpringBoot 快速开启事务(附常见坑点)「建议收藏」
Spring Boot Admin 2.0 详解
Spring Boot Admin是一个开源社区项目,用于管理和监控SpringBoot应用程序。 应用程序作为Spring Boot Admin Client向为Spring Boot Admin Server注册(通过HTTP)或使用SpringCloud注册中心(例如Eureka,Consul)发现。 UI是的Vue.js应用程序,展示Spring Boot Admin Client的Actuator端点上的一些监控。服务端采用Spring WebFlux + Netty的方式。Spring Boot Admin为注册的应用程序提供以下功能:
程序员果果
2019/05/16
2.9K0
Maven工程搭建spring boot+spring mvc+JPA
1、maven工程,少不了pom.xml,spring boot的引入可参考官网:
JQ实验室
2022/02/09
4710
SpringCloud Alibaba Seata处理分布式事务
​ 单体应用被拆分成微服务应用, 原来的三个模块被拆分成三个独立的应用,分别使用三个独立的数据源。
OY
2022/03/17
5200
SpringCloud Alibaba Seata处理分布式事务
Spring boot with Email
本文节选自《Netkiller Java 手札》 地址: http://www.netkiller.cn/java/ 9.12. Spring boot with Email 9.12.1. Maven <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> 例 9.2. Spring boot wit
netkiller old
2018/03/05
1.4K0
Spring boot with Velocity template
本文节选自《Netkiller Java 手札》 地址: http://www.netkiller.cn/java/index.html 9.13. Spring boot with Velocity template 9.13.1. Maven <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-velocity</artifactId> </dependenc
netkiller old
2018/03/05
2.7K0
相关推荐
Spring Boot+cucumber+契约测试
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验