如何快速完成代码的单元测试?

前言

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

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

常用的C语言测试框架有

Unity:一个小型的,开源的C语言测试框架,提供了用于测试的基本结构和函数。简单好用,常用于嵌入式系统开发。

CUnit:一个面向C语言测试的框架,使用简单,支持自动化测试和手动测试。

Check:适用于C语言的单元测试框架,使用简单,支持测试套件、测试用例的管理,便于维护测试组件。

Google Test:Google推出的C++测试框架,支持C语言,可以跨平台,具有丰富的断言库和Mocks。

cmocka:适用于C语言的单元测试框架,支持内存泄漏检测,支持Mock函数和Stub函数等高级用法。

criterion:基于C语言的单元测试框架,支持参数化测试和测试用例依赖,具有良好的性能和易用性。

介绍

这里介绍Unity,其他的可以自行查阅,不同的单元测试框架适用于不同的开发需求和场景。开发人员可以按照自己的项目要求选择最适合的框架。

Unity最小可以只用到几个文件即可完成,把Unity源码目录下的unity.cunity.hunity_internals.h三个文件复制至我们的工程目录下进行编译即可,然后在测试文件代码中包含unity.h

https://github.com/ThrowTheSwitch/Unity/releases

简单的示例完成功能函数的验证

#include <stdio.h>
#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 <stdio.h>
  #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

声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
觉得内容不错的朋友,别忘了一键三连哦!
赞 3
收藏 4
关注 23
成为作者 赚取收益
全部留言
0/200
成为第一个和作者交流的人吧