Cucumber-JVM的示例和运行解析
Cucumber-JVM 是一个支持 Behavior-Driven Development (BDD) 的 Java 框架。在 BDD 中,可以编写可读的描述来表达软件功能的行为,而这些描述也可以作为自动化测试。
Cucumber-JVM 的最小化环境
Cucumber-JVM是BDD的框架, 提供了GWT语法的相关库, 但是其本身没有提供断言库,需要借助其他的单元测试框架。
所以最小化环境需要导入Cucumber-JVM的库 + 单元测试框架(比如JUnit)。
1. 环境搭建
使用Maven 导入的方式如下:
<dependency><groupId>io.cucumber</groupId><artifactId>cucumber-java</artifactId><version>7.15.0</version><scope>test</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency>
2.测试规格和代码
基本环境导入之后, 就可以开始编写BDD的规格和步骤函数了, 以最简单的Hello World入门示例来看,
- 规格文件, 文件名是 hello_world.feature
内容如下:
Feature: Hello WorldScenario: Running a simple hello world functionGiven the system is readyWhen I ask it to say helloThen it should answer with "Hello, World!"
- 步骤函数类文件 HelloWorldSteps.java
/*** Description:* Author: XM Chen* Date: 2023-12-27*/
package com.osxm.bdd.usage;import io.cucumber.java.en.Given;
import io.cucumber.java.en.Then;
import io.cucumber.java.en.When;
import static org.junit.Assert.*;public class HelloWorldSteps {private String actualAnswer;@Given("the system is ready")public void the_system_is_ready() {// 在这里可以进行一些初始化操作}@When("I ask it to say hello")public void i_ask_it_to_say_hello() {actualAnswer = getHelloWorld();}@Then("it should answer with {string}")public void it_should_answer_with(String expectedAnswer) {assertEquals(expectedAnswer, actualAnswer);}private String getHelloWorld() {// 这里是你的 Hello World 函数实现return "Hello, World!";}
}
项目的目录结构如下:

3. 测试的运行
可以使用命令行的方式运行BDD 测试,
java -cp "path/to/each/jar:path/to/compiled/.class/files" io.cucumber.core.cli.Main /path/to/your/feature/files --glue hellocucumber --glue anotherpackage
该命令的解释如下:
java: 运行Java虚拟机的命令。-cp: 设置classpath,用于指定要加载的类和包含依赖项的JAR文件的路径。"path/to/each/jar:path/to/compiled/.class/files": 指定JAR文件和编译后的.class文件的路径。多个路径用冒号分隔。io.cucumber.core.cli.Main: 指定要运行的Cucumber主类。/path/to/your/feature/files: 指定要运行的Cucumber特性文件的路径。--glue hellocucumber: 指定要运行的Cucumber步骤定义文件的包名。在这个例子中,hellocucumber是一个包含Cucumber步骤定义类的包。--glue anotherpackage: 指定另一个包含Cucumber步骤定义类的包。在这个例子中,anotherpackage是另一个包含Cucumber步骤定义类的包,可以在同一个测试中使用。
就本篇的例子来说, 要组成这个命令行,需要获取所有的需要的jar 档, 也就是 -cp 的选项的值, 获取的步骤如下:
- 使用maven 将所有jar 复制到target\test-classes目录下
方式是在pom.xml 加入以下配置:
<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><version>3.1.2</version><executions><execution><id>copy-dependencies</id><phase>package</phase><goals><goal>copy-dependencies</goal></goals><configuration><outputDirectory>D:\devworkspace\vs\bdd-ency\target\test-classes\lib</outputDirectory></configuration></execution></executions></plugin></plugins></build>
- 接下来是获取lib 目录下的文件名,并且以分号分隔, 这个使用python 可以很容易实现,
python 的代码类似:
import os# 获取Windows目录
windows_dir = os.environ['lib']# 列出目录下的文件名
file_names = os.listdir(windows_dir)# 以 ; 分割文件名
file_names_str = ';'.join(file_names)print(file_names_str)
使用bat 命令也可以做到
dir lib /b /a-d > files.txt
汇总后的Java命令行是:
java -cp lib/apiguardian-api-1.1.2.jar;lib/ci-environment-10.0.0.jar;lib/cucumber-core-7.15.0.jar;lib/cucumber-expressions-17.0.1.jar;lib/cucumber-gherkin-7.15.0.jar;lib/cucumber-gherkin-messages-7.15.0.jar;lib/cucumber-java-7.15.0.jar;lib/cucumber-plugin-7.15.0.jar;lib/datatable-7.15.0.jar;lib/docstring-7.15.0.jar;lib/gherkin-26.2.0.jar;lib/hamcrest-core-1.3.jar;lib/html-formatter-20.4.0.jar;lib/junit-4.12.jar;lib/junit-xml-formatter-0.2.0.jar;lib/messages-22.0.0.jar;lib/tag-expressions-6.0.0.jar;./ io.cucumber.core.cli.Main features --glue com.osxm
执行的结果如下图:

在JUnit 4中导入 cucumber-junit 更便捷的运行测试
上面的命令行运行方式很麻烦, cucumber其实提供了很便捷的运行方式, 在使用JUnit 4的项目中, 可以导入cucumber-junit。
<dependency><groupId>io.cucumber</groupId><artifactId>cucumber-junit</artifactId><version>7.15.0</version><scope>test</scope></dependency>
导入之后, 新增一个RunCucumberTest.java 文件,内容如下:
/*** Description:* Author: XM Chen* Date: 2023-12-27*/
package com.osxm.bdd.usage;import io.cucumber.junit.Cucumber;
import io.cucumber.junit.CucumberOptions;
import org.junit.runner.RunWith;@RunWith(Cucumber.class)
@CucumberOptions(features = "src/test/resources", plugin = {"pretty"})
public class RunCucumberTest {// 不需要添加代码,这个类作为配置和测试运行的入口点
}
创建之后在IDE中就可以直接运行这个文件了, 比如在VS Code 中执行及结果如下:

相关文章:
Cucumber-JVM的示例和运行解析
Cucumber-JVM 是一个支持 Behavior-Driven Development (BDD) 的 Java 框架。在 BDD 中,可以编写可读的描述来表达软件功能的行为,而这些描述也可以作为自动化测试。 Cucumber-JVM 的最小化环境 Cucumber-JVM是BDD的框架, 提供了GWT语法的相…...
OSPF ROUTER-ID-新版(15)
目录 整体拓扑 操作步骤 1.INT 验证Router-ID选举规则 1.1 查看路由器Router-ID 1.2 配置R1地址 1.3 查看R1接口信息 1.4 查看R1Router-ID 1.5 删除接口IP并查看Router-ID 1.6 手工配置Router-ID 2.基本配置 2.1 配置R1的IP 2.2 配置R2的IP 2.3 配置R3的IP 2.4 配…...
阿里开源大模型 Qwen-72B 私有化部署
近期大家都知道阿里推出了自己的开源的大模型千问72B,据说对于中文非常友好,在开源模型里面,可谓是名列前茅。 千问拥有有强大的基础语言模型,已经针对多达 3 万亿个 token 的多语言数据进行了稳定的预训练,覆盖领域、…...
ubuntu下编译obs-studio遇到的问题记录
参考的是这篇文档:Build Instructions For Linux obsproject/obs-studio Wiki GitHub 在安装OBS dependencies时, sudo apt install libavcodec-dev libavdevice-dev libavfilter-dev libavformat-dev libavutil-dev libswresample-dev libswscale-d…...
C++的一些知识
一. 语法 move怎么用 https://blog.csdn.net/zhangmiaoping23/article/details/126051520 这个文章讲的很好,其中有一些疑惑的点 (1) 左值引用不能接右值 class T1{int a; }; int main(){T1 t1 T1();T1 && t1_temp T1(); //T1()是一个临时对象…...
大数据 - 大数据入门第一篇 | 关于大数据你了解多少?
🐶1.1 概述 大数据(BigData):指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。 大数据主要解决、海量数据的采…...
C语言——扫雷
扫雷是一款经典的小游戏,那如何使用C语言实现一个扫雷游戏呢? 一、全部源码 直接把全部源码放在开头,如有需要,直接拿走。 源码分为三个文件: test.cpp/c 主函数的位置 #include "game.h"int main() {…...
计算机网络【DNS】
DNS 基本概述 与 HTTP、FTP 和 SMTP 一样,DNS 协议也是应用层的协议,DNS 使用客户-服务器模式运行在通信的端系统之间,在通信的端系统之间通过下面的端到端运输协议来传送 DNS 报文。但是 DNS 不是一个直接和用户打交道的应用。DNS 是为因特…...
Windows实现MySQL5.7主从复制(详细版)
使用免安装版本(官网下载地址) 在Windows上安装两种MySQL服务并同时开启服务 1.下载配置 打开解压文件所在位置,就新建一个配置文件my.ini。 2.主库安装 主库的my.ini配置文件如下: [mysqld] #设置主库端口,注意须是…...
AI 绘画 | Stable Diffusion 视频生成重绘
前言 本篇文章教会你如何使用Stable Diffusion WEB UI,实现视频的人物,或是动物重绘,可以更换人物或者动物,也可以有真实变为二次元。 视频展示 左边是原视频,右边是重绘视频原视频和Ai视频画面合并 教程 这里需要用到Stable Diffusion WEB UI的扩展插件ebsynth_utility…...
使用easyexcel对导出表格添加合计行
文章目录 一、背景二、实现1、写法一2、写法二 三、遇到的问题四、参考 一、背景 近期开发的一个新功能需要导出和前端展示样式一致的统计表格,而前端使用的elementui的table组件,show-summary属性选择后可以自动计算。后端导出时其他单元格与返回前端展…...
Springcloud Alibaba使用Canal将Mysql数据实时同步到Redis保证缓存的一致性
目录 1. 背景 2. Windows系统安装canal 3.Mysql准备工作 4. 公共依赖包 5. Redis缓存设计 6. mall-canal-service 1. 背景 canal [kənl] ,译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。其诞…...
Python入门学习篇(十四)——模块文件操作
1 模块 1.1 理解 包: python中带有__init__.py文件的文件夹 模块: 文件名(不包含.py后缀),如python官方的time.py中time就是模块1.2 示例代码 import datetime# 调用datetime模块中的datetime类的now()方法 t datetime.datetime.now() # 格式化输出日期和时间 strftime(&qu…...
【数据结构】排序之交换排序(冒泡 | 快排)
交换目录 1. 前言2. 交换排序3. 冒泡排序3.1 分析3.2 代码实现 4. 快速排序4.1 hoare版本4.1.1 分析4.1.2 hoare版本代码 4.2 挖坑法4.2.1 分析4.2.2 挖坑法代码实现 4.3 前后指针版本4.3.1 分析4.3.2 前后指针版本代码实现 1. 前言 在之前的博客中介绍了插入排序,…...
AI电商时代开始:阿里能否反杀拼多多
“AI电商时代刚刚开始,对谁都是机会,也是挑战。” 针对阿里员工对于拼多多财报和电商等的讨论,马云在阿里内网罕见地参与了谈论并发言。 阿里巴巴一向雷厉风行,已打响了AI电商的“第一炮”。 根据《晚点LatePost》报道ÿ…...
STC8H系列单片机入门教程之NVC系列语音播报模块(九)
一、模块简述 ● 模组支持3.3V和5V单片机供电系统 ● 标准2.54MM间距排针与外部连接 ● 支持喇叭0.5W/8欧 ● 适合用于超声波距离、电子秤重量、时钟时间、温度、球赛比分等语音播报 二、引脚说明 序号 名称 说明 1 VCC 电源正(3.3V-5V&#…...
认识计算机网络——计算机网络的组成
计算机网络是由多个计算机和网络设备组成的系统,通过通信协议实现数据传输和信息交换。它是现代社会信息技术的重要支撑,广泛应用于各个领域。本文将介绍计算机网络的主要组成部分,包括硬件设备、软件协议和网络服务。 一、硬件设备 计算机网…...
数据的复制
基本概念 数据的复制指的是通过网络链接的多台机器保留相同的副本 为什么要进行数据的复制 使得用户和数据在地理上比较接近,因为大数据要求我们将计算安排在数据存放的位置和我们基本的内存模型不是很一样 ,比如磁盘调入内存之类的。即使系统的一部分…...
【辐射场】3D Gaussian Splatting
三维高斯…喷喷 \, 3D Gaussian Splatting,下文简称3DGS,是好一段时间以来在三维内容创作和三维重建领域比较有热度的一项技术。 它属于基于图像的三维重建方法,意思就是你对现实物体或者场景拍照片,就能给你训练成一个场景模型&a…...
冒泡排序--------(C每日一题)
冒泡排序: 每次将相邻的两个数比较,将小的调到前头--升序 冒泡排序一个结论: n个数要进行n-1轮比较,第j轮要进行n-j次两两比较 循环体代码: int main() {int i, j,n,a[10],t;//n是几个数比较for(j1;j<n-1;j)//控制轮次for…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
