《测试驱动的嵌入式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还是自动化测试用例,通过它,我们系统地得到按我们的意图工作的代码,并且可以同时保持这些代码可工作。

相关文章
|
5月前
|
人工智能 自然语言处理 测试技术
从人工到AI驱动:天猫测试全流程自动化变革实践
天猫技术质量团队探索AI在测试全流程的落地应用,覆盖需求解析、用例生成、数据构造、执行验证等核心环节。通过AI+自然语言驱动,实现测试自动化、可溯化与可管理化,在用例生成、数据构造和执行校验中显著提效,推动测试体系从人工迈向AI全流程自动化,提升效率40%以上,用例覆盖超70%,并构建行业级知识资产沉淀平台。
从人工到AI驱动:天猫测试全流程自动化变革实践
|
8月前
|
数据采集 人工智能 监控
人工智能驱动的软件工程:测试左移的崛起价值
本文探讨了人工智能驱动下测试左移理念在软件工程中的重要性,分析测试工程师在需求评估、AI代码生成及遗留系统优化中的关键作用,揭示AI带来的挑战与机遇,并指出测试工程师需提升技能、关注合规与可维护性,以在AI时代保障软件质量。
444 89
|
6月前
|
机器学习/深度学习 人工智能 测试技术
EdgeMark:嵌入式人工智能工具的自动化与基准测试系统——论文阅读
EdgeMark是一个面向嵌入式AI的自动化部署与基准测试系统,支持TensorFlow Lite Micro、Edge Impulse等主流工具,通过模块化架构实现模型生成、优化、转换与部署全流程自动化,并提供跨平台性能对比,助力开发者在资源受限设备上高效选择与部署AI模型。
559 9
EdgeMark:嵌入式人工智能工具的自动化与基准测试系统——论文阅读
|
数据采集 算法 测试技术
【硬件测试】基于FPGA的1024QAM基带通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的1024QAM基带通信系统的硬件测试版本,包含testbench、高斯信道模块和误码率统计模块。系统新增ila在线数据采集和vio在线SNR设置模块,支持不同SNR条件下的性能测试。1024QAM调制将10比特映射到复平面上的1024个星座点之一,实现高效数据传输。硬件测试结果表明,在SNR=32dB和40dB时,系统表现出良好的性能。Verilog核心程序展示了各模块的连接与功能实现。
333 7
|
11月前
|
机器学习/深度学习 人工智能 并行计算
AI部署架构:A100、H100、A800、H800、H20的差异以及如何选型?开发、测试、生产环境如何进行AI大模型部署架构?
AI部署架构:A100、H100、A800、H800、H20的差异以及如何选型?开发、测试、生产环境如何进行AI大模型部署架构?
AI部署架构:A100、H100、A800、H800、H20的差异以及如何选型?开发、测试、生产环境如何进行AI大模型部署架构?
|
6月前
|
存储 测试技术 API
数据驱动开发软件测试脚本
今天刚提交了我的新作《带着ChatGPT玩转软件开发》给出版社,在写作期间跟着ChatGPT学到许多新知识。下面分享数据驱动开发软件测试脚本。
235 0
|
11月前
|
Linux C语言 iOS开发
C语言结合AWTK开发HTTP接口访问界面
这样,我们就实现了在C语言中使用libcurl和AWTK来访问HTTP接口并在界面上显示结果。这只是一个基础的示例,你可以根据需要添加更多的功能和优化。例如,你可以添加错误处理机制、支持更多HTTP方法(如POST、PUT等)、优化用户界面等。
588 82
|
9月前
|
传感器 人工智能 JavaScript
鸿蒙开发:DevEcoTesting中的稳定性测试
DevEcoTesting主要的目的也是用于软件的测试,可以让开发者无需复杂的配置,即可一键执行测试任务,同时提供了测试报告和分析,无论是对于开发者还是测试同学来说,都是一个非常方便的工具。
303 3
鸿蒙开发:DevEcoTesting中的稳定性测试
|
8月前
|
敏捷开发 运维 数据可视化
DevOps看板工具中的协作功能:如何打破开发、测试与运维之间的沟通壁垒
在DevOps实践中,看板工具通过可视化任务管理和自动化流程,提升开发与运维团队的协作效率。它支持敏捷开发、持续交付,助力团队高效应对需求变化,实现跨职能协作与流程优化。
|
8月前
|
运维 jenkins 测试技术
"还在苦等开发部署环境?3步教你用Jenkins拿回测试主动权"
测试工程师最头疼的问题是什么?依赖开发部署环境! 开发延期→测试时间被压缩→紧急上线后BUG频出→测试背锅。传统流程中,测试被动等待部署,效率低下。而Jenkins自动化部署让测试人员自主搭建环境,实现: ✅ 随时触发测试,不再苦等开发 ✅ 部署效率提升10倍,抢回测试时间 ✅ 改善团队协作,减少互相甩锅 学习Jenkins部署能力,成为高效测试工程师,告别被动等待!