《测试驱动的嵌入式C语言开发》——1.1节为什么我们需要TDD

简介: 本节书摘来自华章社区《测试驱动的嵌入式C语言开发》一书中的第1章,第1.1节为什么我们需要TDD,作者:(美)James W. Grenning,更多章节内容可以访问云栖社区“华章社区”公众号查看

1.1 为什么我们需要TDD
Zune是微软用来与iPod竞争的产品。如果使用测试驱动开发就可能阻止一个在Zune中令人尴尬的bug。2008年12月31日这一天,Zune变成了一块砖头。这个日子有什么特别的吗?那天是新年前夜,闰年的最后一天,也是30GB Zune经历过的第一个闰年。
很多人分析了Zune的这个bug,并且最终定位问题到时钟驱动程序中的一个函数。尽管下面的例子不是实际的那个驱动程序代码,但这段代码有着相同的bug。

很多代码阅读方面的专家在看过这段代码后得出了和我一样的错误结论。我们关注到了布尔表达式(days>366)。闰年的最后一天的确是第366天,但是在这里却没有得到正确处理。在闰年的最后一天,这段代码会进入一个死循环!我决定要为SetYearAndDayOfYear()写一些测试来看看把布尔表达式改成(days>=366)是否可以改正这个错误,就像90%的为Zune的这个bug写博客的人所预测的那样。
在把这段代码放入到自动化测试框架中以后,我写了如下的测试用例,它本可以挽救很多新年前夜的派对:


ec41768ba592c395a975b69fe76cf24e59ea00c4

就像Zune一样,这个测试进入了死循环。在终止测试进程后,我把这个基于几千程序员评审得来的流行改法应用到代码上。令我吃惊的是,测试失败了,这是因为SetYearAndDayOfYear()认为这一天是2009年1月0日。新年前夜派对可以放音乐了,但还存在bug。现在bug更容易看出而且更容易改了。
有了这一个测试,Zune的bug本可以避免。一大群人评审代码后的结论很相似,但大多数人还是没能得到正确的解法。我不是在打击你对代码评审的信心,评审代码还是有必要的。但只有代码运行起来才是唯一能确认它正确的方式。
你会想,我们怎么知道要写这个测试?我们可以在任何有bug的地方写测试。问题是我们不知道bug在哪里——它们可以在任何地方。因此,这意味着我们不得不为所有的东西写测试,至少是为任何可能出错的东西。想象一下所有需要的测试,这有点耸人听闻。但不要着急。你不必为每一年里的每一天都写一个测试,你只需要为每一个关键的日子写测试就可以了。本书就是关于如何写这些测试的。本书将帮你学到该写哪些测试,如何写这些测试,如何去避免在你的产品中出现如Zune一样的bug。
最后,让我们回过头来回答“为什么我们需要TDD”这个问题。我们需要TDD,这是因为我们是人类,人类会犯错误。计算机编程是一项非常复杂的活动。除了其他原因,TDD还是自动化测试用例,通过它,我们系统地得到按我们的意图工作的代码,并且可以同时保持这些代码可工作。

相关文章
|
4月前
|
缓存 运维 数据库
【测试人员兼职指南】利用专业技能:如何从测试转向开发赚钱
本文分享了作者作为测试人员如何利用专业技能转向开发来兼职赚钱的经验,包括分析和解决登录页面跳转、避免重复账号注册、用户登录后首页显示用户名以及添加退出功能等问题,并提供了Django项目中使用sqlite3数据库和后台管理的扩展技巧。
137 1
【测试人员兼职指南】利用专业技能:如何从测试转向开发赚钱
|
17天前
|
存储 安全 物联网
C语言物联网开发之设备安全与代码可靠性隐患
物联网设备的C语言代码安全与可靠性至关重要。一是防范代码安全漏洞,包括缓冲区溢出和代码注入风险,通过使用安全函数和严格输入验证来预防。二是提高代码跨平台兼容性,利用`stdint.h`定义统一的数据类型,并通过硬件接口抽象与适配减少平台间的差异,确保程序稳定运行。
|
1月前
|
机器学习/深度学习 数据采集 人工智能
探索AI驱动的自动化测试新纪元###
本文旨在探讨人工智能如何革新软件测试领域,通过AI技术提升测试效率、精准度和覆盖范围。在智能算法的支持下,自动化测试不再局限于简单的脚本回放,而是能够模拟复杂场景、预测潜在缺陷,并实现自我学习与优化。我们正步入一个测试更加主动、灵活且高效的新时代,本文将深入剖析这一变革的核心驱动力及其对未来软件开发的影响。 ###
|
2月前
|
测试技术 网络安全
什么是软件测试? 软件测试都有什么岗位 ?软件测试和调试的区别? 软件测试和开发的区别? 一位优秀的测试人员应该具备哪些素质? 软件测试等相关概念入门篇
文章全面介绍了软件测试的基本概念、目的、岗位分类、与开发和调试的区别,并阐述了成为优秀测试人员应具备的素质和技能。
234 1
什么是软件测试? 软件测试都有什么岗位 ?软件测试和调试的区别? 软件测试和开发的区别? 一位优秀的测试人员应该具备哪些素质? 软件测试等相关概念入门篇
|
2月前
|
测试技术 C# 数据库
C# 一分钟浅谈:测试驱动开发 (TDD) 实践
【10月更文挑战第18天】测试驱动开发(TDD)是一种软件开发方法论,强调先编写测试代码再编写功能代码,以确保代码质量和可维护性。本文从 TDD 的基本概念入手,详细介绍了其核心步骤——编写测试、运行测试并失败、编写代码使测试通过,以及“红绿重构”循环。文章还探讨了 TDD 的优势,包括提高代码质量、促进设计思考、减少调试时间和文档化。此外,文中分析了常见问题及解决方案,如测试覆盖率不足、测试代码过于复杂、忽视重构和测试依赖过多,并通过一个简单的计算器类的代码案例,展示了 TDD 的实际应用过程。
40 1
|
23天前
|
安全 测试技术 持续交付
云计算时代的软件开发与测试:高效、灵活、可扩展
云计算时代的软件开发与测试:高效、灵活、可扩展
|
2月前
|
人工智能 监控 测试技术
云应用开发平台测试
云应用开发平台测试
66 2
|
2月前
|
存储 测试技术 数据库
数据驱动测试和关键词驱动测试的区别
数据驱动测试 数据驱动测试或 DDT 也被称为参数化测试。
34 1
|
2月前
|
敏捷开发 测试技术
开发模型(瀑布、螺旋、scrum) 和 测试模型(V、W)、增量和迭代、敏捷(思想)及敏捷开发 scrum
文章详细介绍了软件开发过程中的不同开发模型(瀑布、螺旋、Scrum)和测试模型(V模型、W模型),以及增量和迭代的概念,最后阐述了敏捷思想及其在敏捷开发(如Scrum)中的应用。
103 0
开发模型(瀑布、螺旋、scrum) 和 测试模型(V、W)、增量和迭代、敏捷(思想)及敏捷开发 scrum
|
3月前
|
测试技术 持续交付 UED
软件测试的艺术与科学:平衡创新与质量的探索在软件开发的波澜壮阔中,软件测试如同灯塔,指引着产品质量的方向。本文旨在深入探讨软件测试的核心价值,通过分析其在现代软件工程中的应用,揭示其背后的艺术性与科学性,并探讨如何在追求技术创新的同时确保产品的高质量标准。
软件测试不仅仅是技术活动,它融合了创造力和方法论,是软件开发过程中不可或缺的一环。本文首先概述了软件测试的重要性及其在项目生命周期中的角色,随后详细讨论了测试用例设计的创新方法、自动化测试的策略与挑战,以及如何通过持续集成/持续部署(CI/CD)流程优化产品质量。最后,文章强调了团队间沟通在确保测试有效性中的关键作用,并通过案例分析展示了这些原则在实践中的应用。
84 1