代码工艺:实践 Spring Boot TDD 测试驱动开发
TDD 的核心理念是 “先写测试,再写功能”,其过程遵循一个严格的循环,即 Red-Green-Refactor:
TDD 的流程
1. Red(编写失败的测试)
- 根据需求,先编写一个测试用例,描述期望的行为。
- 运行测试用例,这时测试会失败(因为功能还没实现)。
- 失败的测试是 TDD 的起点,用来验证当前功能还未完成。
2. Green(实现功能使测试通过)
- 编写代码实现功能,只编写足够通过测试的代码。
- 不追求完善或优化,只需让测试通过。
- 运行测试确保它变为绿色(成功)。
3. Refactor(重构代码)
- 在测试通过的前提下,对代码进行重构。
- 目标是提高代码质量(如消除冗余、优化性能),同时保持所有测试用例通过。
- 运行测试用例,确保重构后功能不变。
为什么先写测试?
1. 提高代码质量
- 在功能实现前明确验证条件,降低缺陷风险。
- 保证功能模块始终可测试。
2. 支持重构
- 测试用例成为保障,让开发者在重构时无需担心功能被破坏。
3. 明确需求
- 编写测试用例时,开发者必须准确理解功能需求,并转化为可验证的行为。测试引导功能开发,避免开发过程中偏离需求。
举例
接口文档:计算税收
接口概述
本接口用于根据用户提供的收入(income)和月份(months)计算应缴纳的税收。用户通过发送GET请求到指定URL,传入收入金额和月份数,接口将返回计算后的税收金额。
请求 URL
GET http://localhost:8087/getTax
请求参数
| 参数名 | 类型 | 必填 | 描述 |
|---|---|---|---|
| income | int | 是 | 用户的收入金额 |
| months | int | 是 | 收入的月份数 |
请求示例
GET http://localhost:8087/getTax?income=1234&months=3
响应格式
- 格式: JSON
- 示例:
{"tax": 123.45
}
响应参数
| 参数名 | 类型 | 描述 |
|---|---|---|
| tax | double | 计算出的税收金额 |
TDD
先创建接口:
@RestController
public class TaxController {@AutowiredProcessTaxService processTaxService;@GetMapping("/getTax")public ResponseEntity calculateTax(@RequestParam int income , @RequestParam int months) {return ResponseEntity.ok().body(null);}}
我们需要在这里实现业务逻辑,将收入和月份作为用户输入并处理税收。现在我们需要实现业务逻辑。我们从单元测试开始实现它。
public class ProcessTaxTest {@InjectMocksProcessTaxService processTaxService;@Beforepublic void init() {MockitoAnnotations.initMocks(this);}@Testpublic void testTaxCalcualtion(){int income = 10;int months = 5;double totalTax = processTaxService.calculate(income, months);Assert.assertEquals(15.0, totalTax, 0.001);}}
在这里,我创建了ProcessTaxService类,它将用于实现税收计算代码。但是这个类在我们的代码库中不存在(红色标志),因此我们需要现在创建它。
@Service
public class ProcessTaxService {private double taxPercentage = 0.3;public double calculate(int income, int months) {return income * months * taxPercentage;}}
重构代码,请确保传入的income和months参数为正整数。
@Service
public class ProcessTaxService {private double taxPercentage = 0.3;public double calculate(int income, int months) {if (income <= 0 || months <= 0) {throw new IllegalArgumentException("Income and months must be positive values.");}return income * months * taxPercentage;}}
@RestController
public class TaxController {@AutowiredProcessTaxService processTaxService;@GetMapping("/getTax")public ResponseEntity calculateTax(@RequestParam int income , @RequestParam int months) {try {double tax = processTaxService.calculate(income, months);return ResponseEntity.ok().body(tax);} catch (IllegalArgumentException e) {return ResponseEntity.badRequest().body(null);}}}
现在我们已经成功地编写了使用测试驱动方法计算总税收所需的代码。将ProcessTaxService类集成到Controller类中,在用户发送请求时计算税收。
@RestController
public class TaxController {@AutowiredProcessTaxService processTaxService;@GetMapping("/getTax")public ResponseEntity calculateTax(@RequestParam int income , @RequestParam int months) {return ResponseEntity.ok().body(processTax.calculate(income, months));}}
相关文章:
代码工艺:实践 Spring Boot TDD 测试驱动开发
TDD 的核心理念是 “先写测试,再写功能”,其过程遵循一个严格的循环,即 Red-Green-Refactor: TDD 的流程 1. Red(编写失败的测试) 根据需求,先编写一个测试用例,描述期望的行为。…...
深度学习|表示学习|卷积神经网络|通道 channel 是什么?|05
如是我闻: 在卷积神经网络(CNN)中,channel(通道) 是指输入或输出数据的深度维度,通常用来表示输入或输出的特征类型。 通道的含义 输入通道(Input Channels):…...
PCDN的虚拟机与云主机区别
使用虚拟机和云主机运行PCDN(P2P CDN)时,主要存在以下区别: 一、资源分配与灵活性 虚拟机: 资源受限:虚拟机运行在物理服务器上,其资源(如CPU、内存、带宽)受到物理服务…...
计算机网络 (57)改进“尽最大努力交付”的服务
前言 计算机网络中的“尽最大努力交付”服务是网络层的一种数据传输方式。这种服务的特点是网络层只负责尽力将数据报从源端传输到目的端,而不保证数据传输的可靠性。 一、标记与分类 为数据分组打上标记: 给不同性质的分组打上不同的标记&#x…...
Redis 详解
简介 Redis 的全称是 Remote Dictionary Server,它是一个基于内存的 NoSQL(非关系型)数据库,数据以 键值对 存储,支持各种复杂的数据结构 为什么会出现 Redis? Redis 的出现是为了弥补传统数据库在高性能…...
如何解压rar格式文件?8种方法(Win/Mac/手机/网页端)
RAR 文件是一种常见的压缩文件格式,由尤金・罗谢尔(Eugene Roshal)开发,因其扩展名 “rar” 而得名。它通过特定算法将一个或多个文件、文件夹进行压缩,大幅减小存储空间,方便数据传输与备份。然而…...
网络仿真工具Core环境搭建
目录 安装依赖包 源码下载 Core安装 FAQ 下载源码TLS出错误 问题 解决方案 找不到dbus-launch 问题 解决方案 安装依赖包 调用以下命令安装依赖包 apt-get install -y ca-certificates git sudo wget tzdata libpcap-dev libpcre3-dev \ libprotobuf-dev libxml2-de…...
Coze插件开发之基于已有服务创建并上架到扣子商店
Coze插件开发之基于已有服务创建并上架到扣子商店 在应用开发中,需要调用各种插件,以快速进行开发。但有时需要调用的插件在扣子商店里没有,那怎么办呢? 今天就来带大家快速基于已有服务创建一个新的插件 简单来讲,就是…...
ORACLE-主备备-Failover
背景 随着业务的不断增涨,至使现有的单节点DG环境的连接已经无法满足当前业务需求,并且随着业务的重要性,同时也要求数据库的高可用性,减少数据库故障对业务的影响。于是规划迁移方案。 迁移方案如下: 因PRIMARY库本地磁盘空间已达到80%决定弃用,搭建高可用2个节点的RAC做…...
wampserver + phpstrom 调试配置
step 1 点击任务栏wampserver图标->php->php.ini[apache module] 在文件最后面,确保这些值被定义且跟以下的一样 xdebug.mode debug xdebug.start_with_request yes xdebug.client_port 9003 xdebug.client_host 127.0.0.1step 2 按如下配置 step3 下断点,运行即…...
Java Web-Cookie与Session
会话跟踪技术 会话跟踪技术是一种在 Web 应用程序中跟踪用户会话状态的机制,它允许服务器在多个请求之间识别和关联属于同一用户的请求,以便在整个会话过程中保持用户相关的信息。以下是几种常见的会话跟踪技术: Cookie 概念:Cook…...
Couchbase UI: Dashboard
以下是 Couchbase UI Dashboard 页面详细介绍,包括页面布局和功能说明,帮助你更好地理解和使用。 1. 首页(Overview) 功能:提供集群的整体健康状态和性能摘要 集群状态 节点健康状况:绿色(正…...
每日 Java 面试题分享【第 13 天】
欢迎来到每日 Java 面试题分享栏目! 订阅专栏,不错过每一天的练习 今日分享 3 道面试题目! 评论区复述一遍印象更深刻噢~ 目录 问题一:如何在 Java 中调用外部可执行程序或系统命令?问题二:如果一个线程…...
探究 Facebook 隐私安全发展方向,未来走向何方?
随着社交媒体的普及,隐私和数据安全问题成为了全球关注的焦点。Facebook,作为全球最大的社交平台之一,其隐私安全问题尤其引人注目。近年来,随着用户数据泄露事件的不断发生,Facebook 不断调整其隐私政策,探…...
第三十一周学习周报
目录 摘要Abstract文献阅读总体架构实验分析 知识复习总结 摘要 在本周阅读的文献中,作者提出了一种基于生成对抗网络(GAN)和长短期记忆网络(LSTM)融合模型的连续管钻井参数预测方法,旨在提高连续管钻井的…...
白嫖一个可以公网访问、带评论和图床的博客系统
这里我来把搭建这个网站的过程记录下,可供新手朋友搭建 完成github page的创建 首先先打开github官网,然后打开your repositories这个标签 然后新建一个repositories,名字是比较特殊的,为<username>.github.io这个格式&am…...
定时器、计数器
定时器:TON TOF TONR:保持型接通定时器 TP:脉冲定时器:触发一次,就开始计时 TP:按下I0.1 TP开始计时,Q电开始有电,时间到Q点失电 计数器:CTU加 CTD减 CTUD加减 两个方法…...
Ubuntu Server连接wifi
背景 家里服务器放在客厅太吵了, 准备挪到阳台, 所以买了TP wifi接收器, 因此需要配置wifi连接. 刚开始买了Tenda Ax300, 结果不支持服务器系统, 买前还是得和客服交流交流. 准备 驱动安装 对于windows系统来说, 这款接收器是免驱的, 但在linux上需要安装相应型号驱动 安装…...
关于MySQL InnoDB存储引擎的一些认识
文章目录 一、存储引擎1.MySQL中执行一条SQL语句的过程是怎样的?1.1 MySQL的存储引擎有哪些?1.2 MyIsam和InnoDB有什么区别? 2.MySQL表的结构是什么?2.1 行结构是什么样呢?2.1.1 NULL列表?2.1.2 char和varc…...
深入剖析SpringBoot启动机制:run()方法详尽解读
摘要 本文深入解析SpringBoot的启动机制,以run()方法为核心,逐步追踪并详细解释其关键步骤。首先探讨run()方法的工作原理,然后深入代码层面分析各个关键环节。文章提供刷新后钩子和启动后任务的代码示例,帮助读者理解SpringBoot源…...
Win10 22H2多合一版本实测:家庭版/专业版/企业版到底有什么区别?
Win10 22H2多合一版本深度解析:如何根据需求选择最佳系统版本 当你面对一个包含家庭版、专业版、企业版等多个版本的Win10 22H2多合一ISO镜像时,是否曾感到困惑:这些版本之间究竟有什么区别?哪个版本最适合我的使用场景࿱…...
Z-Image-GGUF开源模型价值:Z-Image原始论文复现支持+GGUF量化技术白皮书同步发布
Z-Image-GGUF开源模型价值:Z-Image原始论文复现支持GGUF量化技术白皮书同步发布 1. 项目核心价值:一次部署,双重收获 如果你正在寻找一个既能体验前沿文生图模型,又能深入了解其底层技术原理的解决方案,那么Z-Image-…...
SDMatte新手入门:交互式点选,让复杂抠图变简单
SDMatte新手入门:交互式点选,让复杂抠图变简单 1. 什么是SDMatte? SDMatte是一款基于扩散模型的交互式图像抠图工具,由vivoCameraResearch团队开发。它通过简单的点选操作,就能实现专业级的图像抠图效果,…...
OCRmyPDF:让扫描PDF焕发新生的开源解决方案
OCRmyPDF:让扫描PDF焕发新生的开源解决方案 【免费下载链接】OCRmyPDF OCRmyPDF adds an OCR text layer to scanned PDF files, allowing them to be searched 项目地址: https://gitcode.com/GitHub_Trending/oc/OCRmyPDF 在数字化办公的浪潮中,…...
Notepad4:轻量级编辑器的技术突破与实用指南
Notepad4:轻量级编辑器的技术突破与实用指南 【免费下载链接】notepad2 Notepad2-zufuliu is a light-weight Scintilla based text editor for Windows with syntax highlighting, code folding, auto-completion and API list for many programming languages and…...
开源DapFlash深度体验:除了下载程序,它的HEX编辑器还能帮你做什么?
开源DapFlash深度体验:HEX编辑器的隐藏技能树 当大多数嵌入式工程师将DapFlash视为又一个程序烧录工具时,它的HEX编辑器正在芯片深处执行着堪比"数字考古"的任务。上周在调试一款智能家居主控板时,我意外发现Bootloader区域被异常覆…...
超实用AI专著生成攻略,掌握工具技巧,轻松搞定大型学术著作
学术专著创作困境与AI写作工具解决方案 撰写学术专著时的困难,不仅仅体现在“能够写出来”,更关键的是“能够成功出版并获得认可”。在当今的出版行业,学术专著的受众群体相对较小,出版社在选择题材时,对其学术价值以…...
音乐播放器界面定制指南:foobar2000美化方案与体验提升
音乐播放器界面定制指南:foobar2000美化方案与体验提升 【免费下载链接】foobox-cn DUI 配置 for foobar2000 项目地址: https://gitcode.com/GitHub_Trending/fo/foobox-cn 在数字音乐时代,播放器已不仅是播放工具,更是个人音乐品味的…...
别再重复积分了!手把手教你用IMU预积分优化LIO-SAM(附代码避坑点)
激光SLAM实战:IMU预积分在LIO-SAM中的高效实现与调优指南 当你在深夜调试LIO-SAM时,是否曾被重复积分导致的性能瓶颈折磨得抓狂?IMU预积分技术正是解决这一痛点的银弹。不同于传统惯性积分对初始状态的强依赖,预积分将相对运动量…...
掌握MediaPipeUnityPlugin:从0到1的面部表情捕捉实践指南
掌握MediaPipeUnityPlugin:从0到1的面部表情捕捉实践指南 【免费下载链接】MediaPipeUnityPlugin Unity plugin to run MediaPipe 项目地址: https://gitcode.com/gh_mirrors/me/MediaPipeUnityPlugin 在Unity开发中,实现高精度面部表情捕捉常面临…...
