BDD之单元测试(三):BDD的官方教程

article/2025/10/15 15:36:31

BDD之单元测试(二):ATDD,TDD,BDD的区别 

BDD之单元测试(三):BDD的官方教程

BDD之单元测试(四):实际的项目教程

cucumber

cucumber是BDD(Behavior-driven development,行为驱动开发)的一个自动化测试的副产品。它使用自然语言来描述测试,使得非程序员可以理解他们。Gherkin是这种自然语言测试的简单语法,而Cucumber是可以执行它们的工具。附cucumber官网链接
cucumber本质上是使用根据正则表达式匹配自然语言,然后依次执行对应的方法,以达到测试的目的。

Gherkin

Gherkin是自然语言测试的简单语法。


一个完整的测试是由多个step组成的,step即最小单元,如何复用step是非常关键的问题。

多个step组成一个Scenario,即一个完整的测试case。

多个Scenario组成一个Feature,即一组相关的测试case。

 

关键字

  • Feature:该测试文件的描述
  • Scenario Outline :该测试文件中某一个场景的描述
  • Given,When,Then,And,But(steps):某一个场景的具体步骤
  • Example(or Scenario):某一个场景的具体入参和期望

 

官方教程

一、pom

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

二、接口

package com.example.demo.controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class CucumberController {/*** 判断今天是否是周五** @param today* @return*/@RequestMapping("/isFriday")public boolean isFriday(String today) {return "Friday".equalsIgnoreCase(today);}
}

下面需要对上面这个controller做单元测试;如果使用常规思路去写单元测试的话,应该是新建两个 @Test:

一个是传 Friday 进去,最后给断言; 

一个是传 !Friday 进去,最后给断言; 

该方法,代码覆盖可以实现,但是业务不清晰,我们需要去读业务代码才能知道;

如果使用BDD的话,业务代码就只有一套,我们只需要定义 入参 和 期望 即可,方便扩展,业务清晰。

三、编写 feature

我们在 test/resources/features 下面新建feature: is_it_friday_yet.feature

Feature: Is it Friday yet?Everybody wants to know when it's FridayScenario Outline: Today is or is not FridayGiven today is "<day>"When I ask whether it's Friday yetThen I should be told "<answer>"Examples:| day            | answer || Friday         | true   || Sunday         | false   || anything else! | false   |

Give:today is "<day>",这个 day 是参数替换

When I ask whether it's Friday yet

Then I should be told "<answer>",这个 answer 也是参数替换

下面的Examples就是定义参数的

如果 day 是Friday的话,那么结果就为true

如果 day 不是Friday的话,那么结果就为false

......

测试用例全部写在feature里面,类似黑盒,里面的业务逻辑不需要知道,只需要知道我传入什么,期望什么即可。

四、编写 Steps

package com.example.demo.controller.cucumber.a;import com.example.demo.controller.CucumberController;
import cucumber.api.java.en.Given;
import cucumber.api.java.en.Then;
import cucumber.api.java.en.When;import static org.junit.Assert.*;public class CucumberControllerSteps {private String today;private boolean actualAnswer;private CucumberController cucumberController = new CucumberController();@Given("today is {string}")public void today_is(String today) {this.today = today;}@When("I ask whether it's Friday yet")public void i_ask_whether_it_s_Friday_yet() {actualAnswer = cucumberController.isFriday(today);}@Then("I should be told {string}")public void i_should_be_told(String expectAnswer) {assertEquals(Boolean.parseBoolean(expectAnswer), actualAnswer);}
}

五、编写 RunCucumberTest

package com.example.demo;import cucumber.api.CucumberOptions;
import cucumber.api.junit.Cucumber;
import org.junit.runner.RunWith;@RunWith(Cucumber.class)
@CucumberOptions(plugin = {"pretty"}, features = {"src/test/resources/features"})
public class RunCucumberTest {
}

六、测试运行 RunCucumberTest

 我们可以看到上面图中的红色部分,很符合语义和正常逻辑;

而且测试用例时,不需要改变业务代码,只需要在feature里控制入参和期望即可。

如果你的代码不能很好的适配这个方案,那很可能是代码的设计不合理。 

 


http://chatgpt.dhexx.cn/article/ERCnQAcx.shtml

相关文章

五分钟让你彻底了解TDD、ATDD、BDDRBE

在目前比较流行的敏捷开发模式&#xff08;如极限编程、Scrum方法等&#xff09;中&#xff0c;推崇“测试驱动开发&#xff08;Test Driven Development&#xff0c;TDD&#xff09;”——测试在先、编码在后的开发实践。TDD有别于以往的“先编码、后测试”的开发过程&#xf…

BDD(二元决策图)

转载自&#xff1a;二元决策图(Binary Decision Diagrams - BDD) &#xff08;一&#xff09; 在形式化验证、数字系统的设计和验证中&#xff0c;许多任务都涉及大型命题逻辑公式的运算。二元决策图&#xff08;BDD&#xff09;已经成为许多应用的首选表示方法。1986年&#x…

TDD和BDD的区别 (TDD vs BDD)

前言 如果你关注软件开发最佳实践方面的话题&#xff0c;你肯定听说过测试驱动开发(TDD - Test Driven Development) 和行为驱动开发(BDD - Behavior Driven Development)。这篇文章会为你阐述这两种模式的含义并举例&#xff0c;同时对二者进行比较。 测试驱动开发 (TDD) 当…

行为驱动开发(BDD)全面介绍

行为驱动开发&#xff08;BDD&#xff09;全面介绍 作者&#xff1a;杜铁绳 在软件行业中&#xff0c;软件研发项目软件产品交付经常被推迟、研发费用经常超出预算、经常遗漏客户所需的软件功能、有将近20%的项目最终无法交付&#xff0c;或者取消。这些软件研发往往花费了大…

web自动化测试进阶篇02 ——— BDD与TDD的研究实践

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;【Austin_zhai】 &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xff0c;分享行业相关最新信息。…

全面理解BDD(行为驱动开发):转变思维方式,提升软件质量

在传统的软件开发流程中&#xff0c;开发人员和测试人员的工作通常是相互独立的。开发人员负责编写代码&#xff0c;测试人员负责找出代码中的问题。然而&#xff0c;这种方法可能导致沟通不足&#xff0c;而且会浪费时间和资源。为了解决这些问题&#xff0c;出现了一种新的开…

BDD - 介绍 Behavior-Driven Development 行为驱动开发

BDD - Behavior-Driven Development 行为驱动开发 引言什么是 BDD相关软件开发流程TDDATDDBDD 和 TDD 的关系 BDD 原则BDD 流程BDD 优势 引言 自从接触到 BDD&#xff0c;深有感触&#xff0c;BDD 是广大 QA 的福音&#xff0c;测试领域的天空豁然开朗。BDD 模式更有助于团队合…

BDD自动化测试

BDD&#xff08;行为驱动开发&#xff09;自动化测试在软件测试领域一直在发展。随着agile思想在越来越多的项目中推广&#xff0c;以及非开发人员在项目的更多参与&#xff0c;BDD风格的自动化测试被越来越多项目组采纳并实施。 BDD&#xff08;Behavior Driven Development&…

端到端视频编码:DVC

本文来自CVPR 2019论文《DVC: An End-to-end Deep Video Compression Framework》 官方开源代码地址&#xff1a;https://github.com/GuoLusjtu/DVC DVC是一个端到端的视频编码模型&#xff0c;之前也有过一些基于DNN的视频编码方法&#xff0c;但是通常是使用DNN模型替换视频…

主流视频编码压缩技术基本概念(二) 算法分析

主流视频编码压缩技术基本概念&#xff08;二&#xff09; 算法分析 一、MPEG-1技术介绍1、 MPEG-1的层次及语法结构①、运动补偿序列(Sequence)②、图片组&#xff08;GOP&#xff09;③、 图片&#xff08;Picture&#xff09;④、 图片切片&#xff08;Slice&#xff09;⑤、…

视频编码解码基本知识

最近在做摄像头视频的数据处理&#xff0c;得到了网络相机的.h264格式的数据&#xff0c;需要做解码处理&#xff0c;由于对视频的编码解码原理不太了解&#xff0c;因此查找资料总结一下 为什么要进行视频编码&#xff1f; 视频编码又称为视频压缩&#xff0c;伴随着用户对高…

FFMpeg 实现视频编码、解码

FFMpeg 作为音视频领域的开源工具,它几乎可以实现所有针对音视频的处理,本文主要利用 FFMpeg 官方提供的 SDK 实现音视频最简单的几个实例:编码、解码、封装、解封装、转码、缩放以及添加水印。 接下来会由发现问题->分析问题->解决问题->实现方案,循序渐进的完成。…

感知视频编码

感知视频编码就是在视频编码的过程中&#xff0c;将HVS应用进去&#xff0c;挖掘主观视频感知冗余&#xff0c;进一步提高视频编码压缩效率。 1.Computational visual perception:三种视觉感知计算模型 &#xff08;1&#xff09;视觉敏感模型 &#xff08;2&#xff09;视觉注…

Android视频编码的坑

视频开发是一个核心方向&#xff0c;那Camera开发一直是Android的一个核心&#xff0c;笔者做过Camera HAL&#xff0c;也做过Camera App, 同时也开发过Camera 滤镜&#xff0c;这个过程中也遇到和解决过很多棘手的问题&#xff0c;也一直想总结一篇&#xff0c;看到这篇后感觉…

视频编码未来简史

首先我们回顾一下视频编码的历史&#xff0c;视频编码起源于广播电视&#xff0c;在很长一段时间里视频编解码的变革主要推动力是来自于广播电视。当然&#xff0c;今天我们看互联网的视频编码是速度越来越快&#xff0c;昨天在ICET2017年世界大会上&#xff0c;ICET的主席还说…

PCS2021:针对游戏内容的视频编码工具分析和数据集

本文来自PCS2021论文《Video Coding Tool Analysis and Dataset for Gaming Content》 随着近几年游戏市场的逐渐壮大&#xff0c;新的游戏形态&#xff08;AR、VR、云游戏等&#xff09;逐渐发展。和传统的摄像机内容和屏幕内容相比&#xff0c;游戏内容有着不同的特点导致对于…

视频编码综述

你用手机、电脑看电影追剧时&#xff0c;是看的高清还是标清&#xff1f;我想只要网速够得上应该没有人愿意再看标清了吧&#xff01;毕竟高清视频的高分辨率和清晰画质总是能让人有更好的观影体验。 伴随着用户对高清视频的需求量的增加&#xff0c;视频多媒体的视频数据量也在…

混合视频编码方法

参考文献&#xff1a; IP网络视频传输&#xff1a;技术、标准和应用 朱秀昌&#xff0c;唐贵进。--北京&#xff1a;人民邮电出版社&#xff0c;2017.9 预测编码和变换编码是混合编码的基础&#xff0c;当然除此之外还有运动估计、运动补偿、量化、熵编码、去方块滤波等。下面…

【视频编解码-02】视频编码的目的、条件和目标

视频编码&#xff0c;是视频处理中的一个核心技术。 现代我们所看到的所有视频&#xff0c;包括电视、互联网、手机等等&#xff0c;几乎所有的视频都会被编码、解码。 整个视频技术的基本流程是&#xff1a;视频数据的采集、视频数据的编码、视频数据的传输、视频数据的解码、…

【视频】视频文件格式和视频编码

我们经常在电脑、电视、手机或者其他终端产品看视频&#xff0c;我们对视频有个大概了解&#xff0c;比如清晰度、大小、视频类型等&#xff0c;但是对于视频内部结构我们应该一无所知&#xff0c;现在我们来一步一步解开视频的神秘面纱。 首先大家要清楚两个概念&#xff0c;视…