代码工艺:实践 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
请求参数
参数名类型必填描述
incomeint用户的收入金额
monthsint收入的月份数
请求示例
GET http://localhost:8087/getTax?income=1234&months=3
响应格式
  • 格式: JSON
  • 示例:
{"tax": 123.45
}
响应参数
参数名类型描述
taxdouble计算出的税收金额

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;}}

重构代码,请确保传入的incomemonths参数为正整数。

@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));}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/8112.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

12、本地缓存分布式缓存(未完待续)

1、哪些数据适合放入缓存&#xff1f; 即时性、数据一致性要求不高的访问量大且更新频率不高的数据&#xff08;读多&#xff0c;写少&#xff09; 2、本地缓存 1、本地缓存&#xff0c;如果是单体项目&#xff0c;部署到一台服务器上&#xff0c;就不存在什么问题&#xff…

Linux——网络基础(1)

文章目录 目录 文章目录 前言 一、文件传输协议 应用层 传输层 网络层 数据链路层 数据接收与解封装 主机与网卡 数据传输过程示意 二、IP和MAC地址 定义与性质 地址格式 分配方式 作用范围 可见性与可获取性 生活例子 定义 用途 特点 联系 四、TCP和UDP协…

免费GPU算力,不花钱部署DeepSeek-R1

在人工智能和大模型技术飞速发展的今天&#xff0c;越来越多的开发者和研究者希望能够亲自体验和微调大模型&#xff0c;以便更好地理解和应用这些先进的技术。然而&#xff0c;高昂的GPU算力成本往往成为了阻碍大家探索的瓶颈。幸运的是&#xff0c;腾讯云Cloud Studio提供了免…

阿里前端开发规范

文章目录 1. 为什么前端写代码要规范&#xff1f;一、代码规范的必要性二、 规范带来的好处 2. 资源一、推荐 1. 为什么前端写代码要规范&#xff1f; 一、代码规范的必要性 可维护性 统一的代码风格便于理解和修改减少代码维护成本降低项目交接难度 团队协作 提高团队开发效…

Linux 小火车

1.添加epel软件源 2.安装sl 3. 安装完成后输入&#xff1a; sl

高效流式大语言模型(StreamingLLM)——基于“注意力汇聚点”的突破性研究

论文地址&#xff1a;https://arxiv.org/pdf/2309.17453 github地址&#xff1a;https://github.com/mit-han-lab/streaming-llm 1. 研究背景与挑战 随着大语言模型&#xff08;LLMs&#xff09;在对话系统、文档摘要、代码补全和问答等领域的广泛应用&#xff0c;如何高效且准…

STM32-时钟树

STM32-时钟树 时钟 时钟

日志收集Day007

1.配置ES集群TLS认证: (1)elk101节点生成证书文件 cd /usr/share/elasticsearch ./bin/elasticsearch-certutil cert -out config/elastic-certificates.p12 -pass "" --days 3650 (2)elk101节点为证书文件修改属主和属组 chown elasticsearch:elasticsearch con…

使用Python和Qt6创建GUI应用程序---GUI的一个非常简短的历史

GUI的一个非常简短的历史 图形用户界面有着悠久而可敬的历史&#xff0c;可以追溯到20世纪60年代。斯坦福大学的NLS&#xff08;在线系统&#xff09;引入了鼠标和Windows概念于1968年首次公开展示。接下来是施乐PARC的Smalltalk系统GUI 1973&#xff0c;这是最现代的基础通用g…

如何建设一个企业级的数据湖

建设一个企业级的数据湖是一项复杂且系统化的工程&#xff0c;需要从需求分析、技术选型、架构设计到实施运维等多个方面进行综合规划和实施。以下是基于我搜索到的资料&#xff0c;详细阐述如何建设企业级数据湖的步骤和关键要点&#xff1a; 一、需求分析与规划 明确业务需…

xxl-job分布式定时任务

1 前言 1.1 业务场景 业务数据同步 ( 线上数据同步到线下&#xff0c;新平台老平台数据的同步 ) &#xff0c;消息通知&#xff0c;业务数据的补偿。 1.2 什么是定时任务 定时任务是指基于给定的时间点&#xff0c;给定的时间间隔或者给定执行次数自动的执行程序。 任务调度…

FLTK - FLTK1.4.1 - demo - adjuster.exe

文章目录 FLTK - FLTK1.4.1 - demo - adjuster.exe概述笔记根据代码&#xff0c;用fluid重建一个adjuster.fl 备注 - fluid生成的代码作为参考代码好了修改后可用的代码END FLTK - FLTK1.4.1 - demo - adjuster.exe 概述 想过一遍 FLTK1.4.1的demo和测试工程&#xff0c;工程…

Cursor的简单使用

目录 一、下载与配置 1.1、下载 1.2、汉化 1.3、模型选择 1.4、规则设置 二、Chat&#xff08;聊天&#xff09;和Composer&#xff08;编写助手&#xff09; 三、快捷键 3.1、tab(代码自动补全) 3.2、CtrlL、CtrlI 3.3、系列 3.4、预防、检测、回滚 四、无限登录 …

剥离情绪的内耗

情绪的内耗&#xff0c;指的是我们内心对于某些情绪的过度反应、反复纠结&#xff0c;或者对情感的压抑所产生的心理消耗。这种内耗通常会让我们感到疲惫、焦虑、无力&#xff0c;甚至影响到我们的行为和决策。要真正剥离情绪的内耗&#xff0c;核心在于如何认识、接受并合理处…

android的gradle

资料&#xff1a; GitHub - ChenSWD/CopyGradleInAction: 备份《Gradle IN Action》书中的源码&#xff0c;添加了部分注释 //github上一个开源项目&#xff0c;外加pdf书 Gradle User Manual gradle官网 讲的挺好的博客 Gradle之重新认识Gradle(项目结构、命令行、tas…

Python 之 Excel 表格常用操作

示例文件 test.xlsx 将各个表单拆分成单独的 Excel 文件 import os.pathimport openpyxl import pandasdef handle_excel(file_path):dirname os.path.dirname(file_path)basename os.path.basename(file_path).split(".")[0]wb openpyxl.load_workbook(file_pat…

【C语言系列】深入理解指针(4)

深入理解指针&#xff08;4&#xff09; 一、回调函数是什么&#xff1f;二、qsort使用举例2.1使用qsort函数排序整型数据2.2使用qsort排序结构数据 三、qsort函数的模拟实现四、总结 一、回调函数是什么&#xff1f; 回调函数就是一个通过函数指针调用的函数。 如果你把函数的…

计算机网络 (56)交互式音频/视频

一、定义与特点 定义&#xff1a;交互式音频/视频是指用户使用互联网和其他人进行实时交互式通信的技术&#xff0c;包括语音、视频图像等多媒体实时通信。 特点&#xff1a; 实时性&#xff1a;音频和视频数据是实时传输和播放的&#xff0c;用户之间可以进行即时的交流。交互…

FFmpeg 头文件完美翻译之 libavcodec 模块

前言 众所周知&#xff0c;FFmpeg 的代码开发上手难度较高&#xff0c;源于官方提供的文档很少有包含代码教程相关的。要想熟练掌握 FFmpeg 的代码库开发&#xff0c;需要借助它的头文件&#xff0c;FFmpeg 把很多代码库教程都写在头文件里面。因此&#xff0c;熟读头文件的内…

组件框架漏洞

一.基础概念 1.组件 定义&#xff1a;组件是软件开发中具有特定功能或特性的可重用部件或模块&#xff0c;能独立使用或集成到更大系统。 类型 前端 UI 组件&#xff1a;像按钮、下拉菜单、导航栏等&#xff0c;负责构建用户界面&#xff0c;提升用户交互体验。例如在电商 AP…