0

0

TDD什么时候有意义?

碧海醫心

碧海醫心

发布时间:2024-09-23 08:06:09

|

614人浏览过

|

来源于dev.to

转载

tdd什么时候有意义?

在我的职业生涯中,我经常听说测试驱动开发(TDD)是构建软件的有效方法。然而,我很长一段时间都很难看到好处。最近,当我从事一个非常适合 TDD 的项目时,这种情况发生了变化。在这种情况下,它显着改进了我的开发流程,使其更快并且更不容易出错。在本文中,我将解释何时使用 TDD 以及为什么它在某些场景下效果最好。

当 TDD 达不到要求时

虽然 TDD 是一种强大的方法,但它并不总是适合这项工作的工具。以下是应用 TDD 弊大于利的几种场景:

  • 不明确或不断变化的需求:当需求不明确或仍在变化时,预先编写测试就像在黑暗中拍摄。在这些情况下,我们需要探索问题空间,尝试不同的方法,并随着了解更多而迭代设计。在了解代码应该做什么之前尝试锁定测试会浪费时间并扼杀创造力。

  • 低域逻辑:如果代码库主要关注处理输入/输出(I/O)操作或简单任务,那么首先编写测试没有什么价值。例如,构建“Hello World”程序就是 TDD 过度杀伤力的明显例子。代码太简单、太稳定,几乎没有逻辑可供测试。如果代码与数据库、文件系统或 API 等外部系统大量交互,则预先编写单元测试可能会很不方便且效率较低。边界代码(例如 I/O)与实际领域逻辑的比例较高,意味着 TDD 的投资回报率较低。

何时使用 TDD

现在让我们看看 TDD 何时大放异彩。根据我最近的经验,我发现 TDD 在以下场景中效果最好:

  • 明确的要求:在我提到的项目中,要求非常明确。我确切地知道每个函数对于每种类型的输入的预期输出应该是什么。这使我能够首先编写测试,并确信它们反映了所需的行为。由于清晰,测试指导了开发,确保我的实现是正确的并从一开始就满足业务需求。

  • 复杂领域逻辑:如果您正在开发一个具有大量复杂业务规则的系统,TDD 就会变得非常有价值。在这种情况下,每个测试都会验证逻辑的特定部分是否正确运行。我亲身经历过这一点:添加每个新功能后,我运行测试以查看缺少的内容并迭代代码,直到所有测试都通过。这让我相信每一个新的改变都不会破坏任何现有的行为。

为什么要使用 TDD

  • 行为驱动焦点:编写测试首先帮助我专注于行为,而不是实现。这是一个重要的区别,因为它可以防止测试与代码的内部工作过于紧密地耦合。相反,测试反映了代码应该做什么,使重构变得更容易,而不会不必要地破坏测试。

    绿色大气茶叶网站源码下载1.0
    绿色大气茶叶网站源码下载1.0

    PHPWEB绿色大气茶叶网站源码下载,源码为PHPWEB 2.05 的商业版。本来是为某人制作的网站,在制作之前,问及什么要求。说是没要求,然后按照某某网站来做即可。(即这套程序的1.X的版本)。我再三确认是否有别的要求。都说没有,然后在发给他看的时候又说不满意,完全和那边的站点一样。哎哟我的妈,当初要求就这样,我不按照这个来做怎么做?现在免费发布出来给大家吧!

    下载
  • 长期维护:TDD最大的优势之一就是它带来的长期稳定性。当我稍后重新访问该项目以添加新功能或改进现有功能时,我现有的测试充当了安全网。我可以自信地做出改变,而不用担心回归,因为测试确保一切仍然按预期工作。

实例:使用 TDD 构建自定义 Deck 验证 DSL

在我最近的一个项目中,我应用 TDD 来构建自定义《炉石传说》套牌验证领域特定语言 (DSL)。目标是创建一个系统,允许用户以人类可读的格式定义复杂的套牌构建规则。首先,我设计了该语言的外观,以及它应该涵盖哪些场景。这种明确的需求,加上系统的复杂逻辑,使其成为 TDD 的理想用例。

该项目有两个核心组件,它们从 TDD 方法中受益匪浅:

  • RuleValidator:该组件负责验证用户的输入,以确保其遵循 DSL 的语法和语义。它对输入进行标记,检查结构中的错误,并返回验证错误列表,并为用户提供清晰的消息。如果列表为空,则表示输入有效。 TDD 方法确保在实施过程中测试所有可能的验证场景,包括边缘情况。

    • 测试
    • 实施
  • RuleGenerator:输入经过验证后,RuleGenerator 会将其转换为定义套牌构建规则的 TypeScript 代码。它首先调用 RuleValidator 来确认输入是否正确。对于有效输入,它会根据属性、运算符、修饰符和值生成表示规则的函数。然后,DeckValidator 使用生成的代码来验证这副牌中的牌是否遵循定义的规则。

    • 测试
    • 实施

通过首先编写测试,我确保覆盖了为 DSL 设计的所有场景,这从头到尾指导了开发过程。这些测试充当清单,帮助我验证每个功能是否正确且完整地实现。这个过程还使开发更加顺利,我只是运行测试套件并完成所有失败的测试,而不是依靠内存来跟踪仍需要完成的工作。

当我重构代码时,TDD 的好处变得更加明显。例如,我将较大的功能分解为较小的、可重用的功能,从而改进了整体设计。此外,当我决定添加新的修饰符(用于比较值的 > 和

结论

TDD 在正确的环境中使用时是一种有价值的方法。当您有明确的需求、高水平的领域逻辑并且需要一种可靠的方法来防止随着时间的推移出现回归时,它会表现出色。但是,它可能会在探索阶段或对于琐碎的、边界繁重的代码减慢您的速度。知道何时应用 TDD 以及何时推迟是充分利用 TDD 的关键。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1435

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

225

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

85

2025.10.17

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

334

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2068

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

346

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

251

2023.09.05

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

319

2023.10.09

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

74

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 2.3万人学习

Django 教程
Django 教程

共28课时 | 2.7万人学习

Kotlin 教程
Kotlin 教程

共23课时 | 2.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号