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

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

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


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


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


软件的复杂性


什么是测试驱动开发?

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


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


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


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


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


其论点如下。


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

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

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

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

这就保证了没有技术债务

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


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


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


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

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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


相关文章
|
4月前
|
敏捷开发 监控 测试技术
敏捷软件质量保证的方法与实践
本文介绍了软件质量保证(SQA)的重要性及其在敏捷开发中的实践方法。文章首先指出了传统测试方法的问题,如成本高昂和项目风险加大。为解决这些问题,文中提出了需求审核、代码审核与演练、基于会议的测试及基于风险的测试等多种实践方法。此外,文章还探讨了衡量软件质量的常见指标,如源代码行数、代码段/模块/时间段内的Bug数和代码覆盖率等。文中还详细描述了敏捷开发过程中QA的角色与活动,强调了QA需与开发人员、业务人员及客户密切协作,以确保产品质量。最后,文章指出了在敏捷开发中QA的特殊性及其对团队构成、测试阶段、工作方式等方面的影响。
99 3
敏捷软件质量保证的方法与实践
|
6月前
|
机器学习/深度学习 人工智能 监控
探索自动化测试的利与弊:软件质量保证的新纪元
在数字化时代的洪流中,软件测试作为保障产品质量的关键步骤,已从手动执行转变为自动化流程。本文深入剖析了自动化测试工具的优势与潜在缺陷,并通过实际案例分析,揭示了自动化测试在不同软件开发生命周期中的应用效果。文章旨在为软件测试专业人员提供一个关于是否及如何实施自动化测试的全面视角,同时指出了未来自动化测试可能面临的挑战和发展方向。
48 3
|
6月前
|
敏捷开发 算法 搜索推荐
软件测试的演变:从传统方法到敏捷实践
本文深入探讨了软件测试领域的发展轨迹,从早期以代码为中心的测试方法,到今日强调快速迭代和持续集成的敏捷测试实践。文章通过分析历史数据、行业报告以及权威研究,揭示了测试自动化、跨功能团队合作以及质量保证在现代软件开发中的重要性。进一步地,本文还讨论了如何将科学严谨性融入测试过程,包括采用基于证据的测试策略、利用统计方法评估软件质量,并提出了逻辑严密的测试案例设计原则。
|
8月前
|
敏捷开发 测试技术 持续交付
拥抱不确定性:软件开发中的混沌与秩序
【5月更文挑战第20天】在软件工程的领域,不确定性是一种常态。本文探讨了如何在看似混乱的开发过程中寻找秩序,通过具体实践和技术方法来管理和利用不确定性。我们将分析敏捷开发、持续集成、自动化测试等技术如何帮助开发者在快速变化的环境中保持灵活和响应性。同时,我们也将讨论混沌工程的原则,它教会我们如何在不可预测的系统行为面前构建更加健壮的软件架构。
|
8月前
|
SQL 缓存 开发工具
CodeReview对于一个企业的重要性
odeReview 是开发过程不可或缺的重要一环,如果将代码发布比作一个工厂的流水线,那么 CodeReview 就是流水线接近于终点的质检员,他要担负着对产品质量的保障工作,将“缺陷”从众多的“产品”中挑出,反向推动“生产方”改进生产质量。
91 1
|
敏捷开发 安全 测试技术
敏捷不是银弹
敏捷不是银弹
107 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.
2357 0
|
测试技术 API 微服务
《软件测试52讲》读书笔记 —— 互联网产品的测试策略
《软件测试52讲》读书笔记 —— 互联网产品的测试策略
272 0
《软件测试52讲》读书笔记 —— 互联网产品的测试策略
|
设计模式 安全 Java
没有测试驱动开发、重构、简单设计及结对编程的敏捷只是虚有其表
  与过去 70 年间大多数程序员的做法相比,本章描述的实践有着根本的区别。它们强 制进行大量的分钟级甚至秒级、深刻的、充满仪式感的行为,以至于大多数程序员初次接 触时都会觉得荒唐。于是许多程序员做敏捷时尝试去掉这些实践。然而他们失败了,因为 这些实践才是敏捷的核心。没有测试驱动开发、重构、简单设计及结对编程的敏捷只是虚 有其表,起不到作用。   测试驱动开发是一个足够复杂的话题,需要一整本书才能讲完。本章仅仅是一个概览, 主要讨论使用该实践的理由和动机,而不会在技术方面进行深入的讨论。特别说一下,本 章不会出现任何代码。   程序员是一个独特的职业。我们制造了大量文档,其中包含深奥的技术
165 0