在嵌入式系统中,您使用了哪些最佳实践来进行单元测试?
嵌入式软件在过去的10年里已经取得了长足的进步,但我们通常会执行以下操作:
希望自那时以来情况有所改善。我不会希望这种痛苦发生在我的最大敌人身上。
在PC环境下进行单元测试(使用PC C编译器编译代码并在PC单元测试框架中运行代码)会有很多好处,但需要注意以下几点:
stdint.h
类型,例如 uint16_t
而不是普通的 unsigned int
等。我们遵循了这些规则,并发现在PC单元测试框架中对应用程序层代码进行单元测试后,我们可以有很高的信心它能够正常工作。
在PC平台上进行单元测试的优点:
嵌入式系统是一个广泛的话题,但总体而言,可以将其视为结合了硬件和软件的特定目的产品。我在移动电话领域有嵌入式背景,这只是所有嵌入式系统的一小部分。以下几点我会尽量讲得抽象一些:
尽可能地抽象出硬件依赖性。这样,您可以在模拟的“硬件”上运行单元测试,并且还可以测试各种罕见/异常情况,在目标设备上测试会更加困难。为了避免抽象成本,可以使用条件编译等方法。
尽可能少地依赖于硬件。
在模拟器或交叉编译器环境中运行的单元测试仍然不能保证代码在目标硬件上正常工作。您必须在目标设备上进行测试。尽早在目标设备上进行测试。
作为一名缺乏经验的人,但最近我也在考虑这个问题。我认为最好的方法应该是:
A)在PC环境中尽可能多地编写与硬件无关的应用程序代码,并同时编写单元测试(在PC上进行此操作应有助于强制分离与硬件无关的内容)。这样你就可以使用你选择的单元测试工具,然后通过RS-232和/或示波器和I/O引脚发出时间依赖数据的信号来测试与硬件相关的内容。
B)将所有内容都写在目标硬件上,但是有一个make目标可以有条件地编译单元测试构建,以通过RS-232或其他方式运行单元测试并输出结果(或可用于分析结果的数据)。如果内存不足,这可能会很棘手。
编辑7/3/2009 我刚刚想到了如何对硬件相关内容进行单元测试的另一个想法。如果您的硬件事件发生得太快,无法通过RS-232记录,但您又不想手动筛选大量示波器数据以检查I/O引脚标志是否按预期上升和下降,则可以使用带有集成DIO的PC卡(例如National Instruments的数据采集卡系列)自动评估这些信号的时间。然后,您只需要编写在PC上运行的软件来控制数据采集卡与当前正在运行的单元测试同步。
这里有很多好的答案,但未提及的一些事情是要运行诊断代码,以便:
许多嵌入式处理器都可以在评估板上使用,因此尽管您可能没有真正的输入/输出设备,但通常可以在这些设备之一上执行大量算法和逻辑,通常可以通过jtag进行硬件调试。而“单元”测试通常更多地涉及您的逻辑而不是您的输入/输出。问题通常是如何将测试工件从这些环境中取回。
将代码分为设备相关和设备无关两部分。无关代码可以进行单元测试,不会太麻烦。相关代码需要手动测试,直到你拥有一个流畅的通信接口。
如果你正在编写通信接口,我很抱歉。