Cucumber-JVM的示例和运行解析

2023-12-28 18:44

本文主要是介绍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入门示例来看,

  1. 规格文件, 文件名是 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!"
  1. 步骤函数类文件 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 的选项的值, 获取的步骤如下:

  1. 使用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>
  1. 接下来是获取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的示例和运行解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/546902

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p