在MCU on Eclipse网站上看到Erich Styger在8月26日发布的博文,一篇关于微控制器单元测试的文章,有很高的参考价值,特将其翻译过来以备学习。原文网址:https://mcuoneclipse.com/2018/08/26/tutorial-%CE%BCcunit-a-unit-test-framework-for-microcontrollers/
单元测试是主机开发的常见做法。但对于嵌入式开发,这似乎仍然是一个“空白”领域。主要是因为嵌入式工程师不习惯单元测试,或者因为单元测试的通常框架需要嵌入式目标上的太多资源?
我使用的是μCUnit框架,它是一个小巧易用的框架,面向小型微控制器应用。
uCUnit
框架非常简单:两个头文件和一个.c文件:
uCUnit框架文件
使用uCUnit GitHub站点中的原始站点或使用我从GitHub稍微调整和修改的站点,以与MCUXpresso SDK和IDE一起使用。
概念是单元测试包括提供测试宏的uCunit.h头文件。
头文件中的#define将输出配置为详细或正常:
UCUNIT_MODE_NORMAL或UCUNIT_MODE_VERBOSE
System.c和System.h是系统的连接,主要用于启动,关闭和打印测试结果到控制台。下面是使用printf()方法写入输出的实现,但是这可以被任何写入例程替换或扩展到SD卡上的日志文本。
1 /* Stub: Transmit a string to the host/debugger/simulator */ 2 void System_WriteString(char * msg) { 3 4 PRINTF(msg); 5 6 } 7 8 void System_WriteInt(int n) { 9 10 PRINTF("%d", n); 11 12 }
框架概述
首先,我必须包含单元测试框架头文件:
#include "uCUnit.h"
接着,我必须初始化框架
UCUNIT_Init();
/* initialize framework */
还有一个测试用例包含在UCUNIT_TestcaseBegin()和UCUNIT_TestcaseEnd()中:
UCUNIT_TestcaseBegin(
"Crazy Scientist"
);
/* test cases ... */
UCUNIT_TestcaseEnd();
在最后使用时写一个摘要
UCUNIT_WriteSummary();
如果系统应该关闭使用a
UCUNIT_Shutdown();
测试
该框架提供了多种测试方法,例如:
UCUNIT_CheckIsEqual(x, 0);
/* check if x == 0 */
UCUNIT_CheckIsInRange(x, 0, 10);
/* check 0 <= x <= 10 */
UCUNIT_CheckIsBitSet(x, 7);
/* check if bit 7 set */
UCUNIT_CheckIsBitClear(x, 7);
/* check if bit 7 cleared */
UCUNIT_CheckIs8Bit(x);
/* check if not larger then 8 bit */
UCUNIT_CheckIs16Bit(x);
/* check if not larger then 16 bit */
UCUNIT_CheckIs32Bit(x);
/* check if not larger then 32 bit */
UCUNIT_CheckIsNull(p);
/* check if p == NULL */
UCUNIT_CheckIsNotNull(s);
/* check if p != NULL */
UCUNIT_Check((*s)==’