点击上方蓝色字体了解更多的嵌入式编程实用技能。
如果你觉得该文章对你有帮助,欢迎点赞+关注
软件开发中,每次需求的变更基本都需要改写代码,而代码变更后就需要进行功能测试,当然在功能测试之前需要代码的单元测试,避免代码改动后部分场景没有验证,最后出现各种问题。
通过测试框架快速完成代码的单元测试,不仅可以覆盖之前测试的场景,也能快速反应问题在哪里
常用的C语言测试框架有
Unity:一个小型的,开源的C语言测试框架,提供了用于测试的基本结构和函数。简单好用,常用于嵌入式系统开发。
CUnit:一个面向C语言测试的框架,使用简单,支持自动化测试和手动测试。
Check:适用于C语言的单元测试框架,使用简单,支持测试套件、测试用例的管理,便于维护测试组件。
Google Test:Google推出的C++测试框架,支持C语言,可以跨平台,具有丰富的断言库和Mocks。
cmocka:适用于C语言的单元测试框架,支持内存泄漏检测,支持Mock函数和Stub函数等高级用法。
criterion:基于C语言的单元测试框架,支持参数化测试和测试用例依赖,具有良好的性能和易用性。
这里介绍Unity,其他的可以自行查阅,不同的单元测试框架适用于不同的开发需求和场景。开发人员可以按照自己的项目要求选择最适合的框架。
Unity最小可以只用到几个文件即可完成,把Unity源码目录下的unity.c
、unity.h
、unity_internals.h
三个文件复制至我们的工程目录下进行编译即可,然后在测试文件代码中包含unity.h
https://github.com/ThrowTheSwitch/Unity/releases
简单的示例
完成功能函数的验证
#include
#include "unity.h"
void setUp() {
// 这里可以放置每个测试用例运行前的初始化代码
}
void tearDown() {
// 这里可以放置每个测试用例运行后的清理代码
}
int Add(int a, int b)
{
return a + b;
}
void test_AddFun(void)
{
TEST_ASSERT_EQUAL_UINT(6, Add(1, 5));
TEST_ASSERT_EQUAL_UINT(4, Add(-1, 5));
TEST_ASSERT_EQUAL_UINT(-6, Add(-1, -5));
}
int main()
{
UNITY_BEGIN(); // 启动测试
RUN_TEST(test_AddFun);
UNITY_END(); // 结束测试
return 0;
}
通过串口或终端打印内容为:
C:\test/test.c:47:test_AddFun:PASS
-----------------------
1 Tests 0 Failures 0 Ignored
OK
其中,unity_internals.h
文件中可以修改输出终端,即UNITY_OUTPUT_CHAR
宏的定义
/*-------------------------------------------------------
* Output Method: stdout (DEFAULT)
*-------------------------------------------------------*/
#ifndef UNITY_OUTPUT_CHAR
/* Default to using putchar, which is defined in stdio.h */
#include
#define UNITY_OUTPUT_CHAR(a) (void)putchar(a)
#else
/* If defined as something else, make sure we declare it here so it's ready for use */
#ifdef UNITY_OUTPUT_CHAR_HEADER_DECLARATION
extern void UNITY_OUTPUT_CHAR_HEADER_DECLARATION;
#endif
#endif
其中自定义实现的C语言扩展库(cot)的容器功能函数都已通过Unity添加了对应的单元测试用例,有兴趣的朋友可以参考:
下载链接(点击阅读原文):https://gitee.com/const-zpc/cot