《测试驱动的嵌入式C语言开发》——3.6节增量式前进

简介: 本节书摘来自华章社区《测试驱动的嵌入式C语言开发》一书中的第3章,第3.6节增量式前进,作者:(美)James W. Grenning,更多章节内容可以访问云栖社区“华章社区”公众号查看

3.6 增量式前进
刚刚接触TDD的人往往为这样的早期版本代码而感到困惑。“我们什么也没有测到(你可能这样想),这只是些硬编码的返回值”;“或者测试太小了,我们只是在各种活动间跳来跳去”。让我来进一步解释。
DTSTTCPW:先仿冒再建造
回首我刚刚学习极限编程时,Kent Beck在黑板上写下了这个很到位的缩写:DTSTTCPW。它读起来还蛮押韵的;我希望我也能找到那么押韵的一组词。它是Do The Simplest Thing That Could Possibly Work(只做简单够用的东西)的英文缩写。当你只写了几个简单的测试时,通常最简单的事就是仿冒它。LedDriver通过硬编码写到LED地址中的值来仿冒它。一旦你的测试多起来,仿冒就没那么容易了—可能还是真实的实现,或者部分的真实实现更简单。
在传统的开发方式中,放入硬编码的值可以是很严重的问题。当这样的捷径方式深埋在实现当中时,它很容易被忘记。这在TDD中却不是什么大问题,因为你还会回到这些地方来。随着你设计出更多的测试,这些弱点就会暴露出来。如果你担心你会忘记,那么在测试列表中记上一笔。
当我第一次见到Kent Beck仿冒返回值时,我很困惑。但我自己尝试了一下并发现这样可以工作。正如Kent建议的那样,我确保写了所需的所有测试。在有了相当多的TDD经验后,我有了一个重大的发现:尽管实现离正确还有相当大的差距,但测试是正确的!
我教过很多人TDD,并且给他们演示“仿冒它直到做出它”。他们总是问:“那什么时候停止仿冒转而写真实的代码?”我对此简单的首要原则是,一旦去仿冒它比做出它还要麻烦时就做出它。你很快就会明白我说的是什么意思了。
保持小而专注的测试
有几件事值得我们注意。你可能会想,为什么需要第二个测试用例来测试关闭LED 1呢?要测试关闭LED 1最简单的做法不是给TEST(LedDriver, TurnOnLedOne)加一点代码就可以了吗?但这会让我们的测试缺乏关注。这样就会有两个原因能让该测试失败:LedDriver_TurnOn()坏掉,或者LedDriver_TurnOff()坏掉。
在第二个测试中,请注意,并没有对于LedDriver_TurnOn()是否正常工作的检查。(TEST LedDriver,TurnOnLedOne)进行检查,所以我们并不需要在这个以及后面的测试中不断地检查它。
刚刚做TDD的程序员往往在每个测试中放入太多东西。这会破坏可读性和关注点。对于一个测试用例中该有多少行断言并无限制,正如对一个函数中该有多少行代码并无限制一样。但是我们要保持测试可读、小巧并且专注。四段测试模式的每一步(建立、执行、验证和拆除)应该在每个测试用例中都清晰可见。当测试变得很大或很不清晰时,它们作为文档的价值就不存在了。当测试变得不清晰,读者会弄不明白它们到底要达到什么目的。让你的测试保持既小又专注,并且给它们起好名字,它们会在今后的几年里回报你。
比较理想的情况是一个单一的代码问题只会导致单一的测试失败。顺便说一下,这个理想情况永远不可能达成,但这仍不失为一个好点子。
绿了之后就重构
TDD中另一个不可分割的部分是重构。重构就是经常清理代码和设计。我们会在第4章中继续开发LedDriver时进行重构。我们还会在第12章中深入讨论重构。
唯一可以安全地进行重构的时刻是当所有的测试都通过时。这里进一步强调一下,不要在测试不通过的情况下重构!当有测试失败时,你并没有锁住代码的行为。结构化发生改动,当它与失败的测试纠缠在一起时可能会非常难以重新回到所有测试都通过的状态。让测试保持通过就是保护网,它让重构的杂技安全地进行。现在测试已经通过了,所以让我们来看看我们的新代码里有没有什么问题。
当你具备了训练有素的嗅觉时,你会在设计变坏到难以简单改正之前就闻到一些味道。
测试代码已经有坏味道了——重复。virtualLeds在每个测试用例中都要创建一遍,每个测试用例都要调用一遍LedDriver_Create()。TEST(LedDriver, LedsOffAfterCreate)还是要有,因为它处理一种特殊的情况。移出在另两个测试中的重复,如下所示:


d6405a8ebe584b32118a19c19cb59f94648d776c


17de654e5fa8b70479d1e32652d91912ff1fbd56

测试即文档,应当小心地命名它们。一旦测试通过后,请确保名字能表达测试的意图。

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