测试驱动开发是解决技术债务的银弹吗?

简介: 测试驱动开发是解决技术债务的银弹吗?

大家好,我是阿萨。本期继续聊聊测试驱动开发。


测试驱动开发(TDD)是解决技术债务的银弹吗?TDD并不能防止技术债务。事实上,TDD技术本身可以创造出多层隐藏的技术债务,如果不及时发现,就会产生灾难性的后果。


为什么技术债务不是我们的错


软件的复杂性


什么是测试驱动开发?

测试驱动开发(TDD)是一种开发实践,旨在鼓励纪律、结构和优质代码。它分三个阶段进行,被称为 "TDD三角"。


红色--重新写一个测试,检查所需功能是否工作。最初测试失败是因为该功能并不存在。


绿色--写一个基本的功能实现,只要能让测试通过就可以了。


重构--修改你的实现,使其更好、更干净、更有效。


软件行业的许多人认为,TDD是技术债务的解决方案。


其论点如下。


严格实行TDD的组织对其所有代码进行单元测试

这确保所有的功能都是经过深思熟虑的

它还可以测试核心功能是否有松散或明显的失败。

代码中的任何漏洞,也就是技术债务,都会导致测试失败并破坏构建。

这就保证了没有技术债务

这种说法是否站得住脚?正如许多业内人士所知道的,它并不成立。


TDD周期的每个阶段,隐藏的技术债务都会积累起来。


这并不是因为TDD有什么问题。它可以发生在任何开发方法中。TDD的问题在于,它创造了一种虚假的安全感,导致团队认为他们的技术债务比实际要少。


隐性技术债务是如何在TDD中积累起来的?

让我们仔细看看TDD的三个阶段中的每一个。


红色阶段--隐藏的技术债务


在这个阶段会发生什么。开发人员编写测试,预计他们将在下一阶段建立的功能。


什么会出错:在 "红色 "阶段,开发人员不知道最终的实现会是什么样子。他们不知道在同行评审、管理评审或客户评论中可能引入的新需求。他们也无法预测当前模块与其他模块的所有可能的相互作用,特别是与尚未存在的未来模块的相互作用。


它是如何导致技术债务的。因为很多事情在前期不知道,开发人员不可能建立覆盖所有可能情况的测试。诚然,TDD创造了一个 "安全线束",可以捕捉重大错误。然而,许多质量问题可能存在于代码中,而这些问题是特定于实现的,在测试阶段没有考虑到。


绿色阶段--隐藏的技术债务


在这个阶段会发生什么。开发人员编写的代码能够满足客户的需求(至少在最低水平上),并使测试通过。


什么会出错?在TDD方法中,一个非常强烈的假设是,测试是好的和全面的。并非所有的测试都是正确的,或以一种明智的方式进行测试。一些开发人员没有很好的测试技能(虽然他们可能是优秀的开发人员),或者他们可能在测试方面很出色,但没有足够的时间来设计一个完美的测试。


它是如何导致技术债务的。如果单元测试不能完美地模拟功能,在实现中可能会遗漏一些重要的东西,而测试仍然会通过。


重构阶段性隐藏的技术债务


在这个阶段会发生什么。开发人员改进他们的实现,确保测试仍然通过,但代码在解决手头的问题时更加优雅和高效。


什么会出错?Martin Fowler在2005年他的Bliki上的一篇文章中简明扼要地指出了这一点。


我听到的最常见的搞砸TDD的方式是忽略了第三步。重构代码以保持它的清洁是这个过程的关键部分,否则你最终只会得到一个混乱的代码片段的集合。(至少这些代码会有测试,所以比起大多数设计的失败,这是一个不太痛苦的结果)。


它是如何导致技术债务的。即使在具有德国式精确性的软件开发团队中,也不存在100%的纪律性。一些开发人员,至少在某些时候,会做不到TDD的第三阶段,或者只做了一部分。为了解决问题而快速编写的代码,如果没有充分的重构,通常很难阅读、维护和扩展。


人们普遍认为,软件的复杂性,即没有重构而快速编写的代码的主要结果,代表了技术债务。


一个更健康的TDD形式:专注于最重要的东西


在这篇文章中,我们展示了技术债务是如何在TDD过程的三个阶段中悄悄出现的。通过努力,技术债务是可以避免的,但是对于大多数开发者来说,要想一直保持所有代码的清洁是很困难的。


现在需要的是一个优先级系统,以帮助团队了解产品中哪些部分的质量问题风险最高,并将他们的努力集中在那里。TDD不一定是一刀切的。你可以在产品的某些部分投入特别的精力进行测试,而对其他部分则要宽松一些。这可以节省大量的时间,并确保测试真的是正确的,在最需要的地方。


相关文章
|
5月前
|
机器学习/深度学习 人工智能 监控
探索自动化测试的利与弊:软件质量保证的新纪元
在数字化时代的洪流中,软件测试作为保障产品质量的关键步骤,已从手动执行转变为自动化流程。本文深入剖析了自动化测试工具的优势与潜在缺陷,并通过实际案例分析,揭示了自动化测试在不同软件开发生命周期中的应用效果。文章旨在为软件测试专业人员提供一个关于是否及如何实施自动化测试的全面视角,同时指出了未来自动化测试可能面临的挑战和发展方向。
47 3
|
5月前
|
监控
软件复用问题之软件工程中事中缓释,如何解决
软件复用问题之软件工程中事中缓释,如何解决
|
6月前
|
Devops 测试技术 持续交付
软件测试中的敏捷实践:从理论到应用
在软件开发领域,敏捷方法论的兴起已经彻底改变了项目的开发和测试流程。本文将深入探讨如何在软件测试中实施敏捷实践,以及这些实践如何提高产品质量和团队效率。通过引用最新的行业报告、科学研究和统计数据,文章旨在为读者提供一套清晰的指导框架,帮助他们在软件测试过程中实现敏捷性。
102 0
|
机器学习/深度学习 安全 测试技术
我亲身经历的2022年软件质量工作
我亲身经历的2022年软件质量工作
|
前端开发 Unix 图形学
没有银弹:软件工程的本质性与附属性工作
NO SILVER BULLET: ESSENCE AND ACCIDENTS OF SOFTWARE ENGINEERING It's adapted from berkeley . If you want to know more, you visit the orignal articlehere.
2355 0
|
设计模式 Serverless 领域建模
实战经验 | 怎样才能提升代码质量?
提升代码质量的三个有效方法:领域建模、设计原则、设计模式。
实战经验 | 怎样才能提升代码质量?
|
测试技术 API 微服务
《软件测试52讲》读书笔记 —— 互联网产品的测试策略
《软件测试52讲》读书笔记 —— 互联网产品的测试策略
271 0
《软件测试52讲》读书笔记 —— 互联网产品的测试策略
|
设计模式 安全 Java
没有测试驱动开发、重构、简单设计及结对编程的敏捷只是虚有其表
  与过去 70 年间大多数程序员的做法相比,本章描述的实践有着根本的区别。它们强 制进行大量的分钟级甚至秒级、深刻的、充满仪式感的行为,以至于大多数程序员初次接 触时都会觉得荒唐。于是许多程序员做敏捷时尝试去掉这些实践。然而他们失败了,因为 这些实践才是敏捷的核心。没有测试驱动开发、重构、简单设计及结对编程的敏捷只是虚 有其表,起不到作用。   测试驱动开发是一个足够复杂的话题,需要一整本书才能讲完。本章仅仅是一个概览, 主要讨论使用该实践的理由和动机,而不会在技术方面进行深入的讨论。特别说一下,本 章不会出现任何代码。   程序员是一个独特的职业。我们制造了大量文档,其中包含深奥的技术
163 0
开发人员生产力指南,细节决定成败!
众所周知,“做决定” 对我们的成功有多么重要。然而,我们经常做出一些错误的决定。并且,“大”决定容易做,“小”决定却很难。但是,我们没有意识到的是,这些细小决定的累加总和决定了我们人生的成功。

热门文章

最新文章