当前位置:首页 > > 大橙子疯嵌入式


前言

软件开发中,每次需求的变更基本都需要改写代码,而代码变更后就需要进行功能测试,当然在功能测试之前需要代码的单元测试,避免代码改动后部分场景没有验证,最后出现各种问题。

通过测试框架快速完成代码的单元测试,不仅可以覆盖之前测试的场景,也能快速反应问题在哪里

常用的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


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
关闭