如何快速完成代码的单元测试?
扫描二维码
随时随地手机看文章
前言
软件开发中,每次需求的变更基本都需要改写代码,而代码变更后就需要进行功能测试,当然在功能测试之前需要代码的单元测试,避免代码改动后部分场景没有验证,最后出现各种问题。
通过测试框架快速完成代码的单元测试,不仅可以覆盖之前测试的场景,也能快速反应问题在哪里
常用的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





