《测试驱动的嵌入式C语言开发》——3.5节先测试驱动接口再测试驱动内部实现

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

3.5 先测试驱动接口再测试驱动内部实现
好的接口对于设计良好的模块来讲很关键。前面几个测试会驱动接口设计。关注于接口意味着我们是从外向内开发代码的。测试作为接口的首个用户,从调用者(或客户端代码)的角度给出了开发代码的使用方式。从使用者的角度出发会产生可用性更强的接口。
我通常也会让前面的几个测试来检验一些产品代码的边界条件。选择一个带边界检查的简单用例。


d71b4e9f8f7597f7087c11ace2e597f1c184b0d3

为了消除这个编译错误,在模块的接口声明头文件中增加这个接口函数原型:


13e9ed512207f0b8fdf5abf0ba8ae6775a881841


b4802823e2d870b4f46fd48f7435a47c31bbb8f7

写出并且通过这些测试能帮助我们实现以下目标:它定义了驱动程序的一个接口函数并确保我们的做法在硬件上可行。但我保证你肯定还是很困惑。
实现是错的
正如很多工程师一样,你很可能会对硬编码一些明显错误的东西感到很不安。这样的最终实现也应该只能够设置最低的那一位。但是,你仔细想想,到目前我们写的测试已经通过。如果我们不是在练习TDD,那么还要写更多的测试,否则这样的错误实现会导致软件缺陷。但我们正是在使用TDD并且还会写更多的测试来暴露这些弱点。
我很难想象这样的实现,即让我们测试列表中的测试都通过之后还能在原来的位置保持这些错误。但如果你发现硬编码了一些东西并且不能被现有的测试列表所覆盖,那么马上写一个测试来暴露这个弱点或者在测试列表中加上一个新条目。
测试是对的
在实现还不完整的时候,你可能会认为什么也没有测试到。当然有!现在的测试确保将变量置为1!
请尝试从另一个角度来思考这个问题。测试是对的!它们是TDD产生的非常有价值的副产品。这些简单的实现测试了我们的测试用例。测试用例失败表明这些测试可以发现错误的结果。把正确答案硬编码进去能证明测试用例可以发现正确的结果。这些测试是正确的并且具有价值,尽管产品代码还不完整。稍后,随着实现的演进,这些看似琐碎的测试用例会测试重要的行为和边界条件。从根本上来讲,我们是在收紧一个夹在被测代码上的老虎钳,把代码的行为紧紧夹住。

别担心,产品代码不会一直这样硬编码很久的。一旦你需要打开一个不同的LED,就不需要硬编码了。真实的实现并不是很难,但我要求你坚持抵制住不去写那些不是现在的测试所需要的代码。我们在演进设计。增加那些不是现在的测试所需要的代码的问题是,你大概就不会再去写能让代码不产生bug所需的所有测试了。
在有测试要求之前就增加代码会增加复杂度。有时你对需求的理解可能是错的,其结果是引入了不必要的复杂度。并且,“我会用到这个”的想法永无止境。那么什么时候才要停下来?在TDD实践中,在当前的测试不再对代码有新的要求时我们就会停下来。大概的终点列举在测试列表中。
TDD是一种结构化的延迟。它推迟产生正确的产品代码,直到由测试强迫我们完成实现。其最终的目标在所有正确的测试都就位之后才实现。
选择下一个测试
下一步要测试什么?我们当然可以写一个新测试来迫使我们移除由简单思维而生成的实现。但我更倾向于进一步演进接口以使在建的模块的样子更清楚些。让我们把刚刚打开的LED关掉。打开和关闭刚好互相补充,并且可以很方便地在后面验证LED的操作时不会互相影响。另外,我们甚至可以真的把这个代码发布到目标系统中,如果我们需要做的只是打开LED 1。就这么定了——让我们写个测试来关闭LED 1。


bd89f43fb8b700c3f8ee4d0d4e7241f9824d97bd

现在所有的测试又都通过了。

此时此刻,LED驱动程序的接口已经初具规模。我们有了三个测试和一个驱动程序的骨架实现。我们会在第4章再回到这段代码上来。但首先让我们来讨论一下我们做的这几个小的步骤。

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