Cmocka 单元测试配置与使用

0. 前言

在 Windows 环境下配置 Cmocka 单元测试,并使用该框架进行单元测试。

1. Cmocka介绍

Cmocka 是一个 C 单元测试框架,支持 mock objects(打桩)。它只需要标准的 C 库,可以在一系列计算平台(包括 embedded )和不同的编译器上运行。

Cmocka 库提供:

  • Running Tests 是整个测试的运行函数
  • Standard Assertions 对标准assert的一种替换方案,防止测试被assert打断
  • Checking Parameters 用于对函数参数的检测
  • Mock Objects 用于mock对象,常用作mock函数的返回,实现方式与Checking Parameter类似
  • Dynamic Memory Allocation 用于对内存的检测
  • Assert Macros 包含了常用的断言

2. GNU工具链安装

MSYS2(Minimal SYStem 2)是一个集成了大量的GNU工具链、工具和库的开源软件包集合。它提供了一个类似于Linux的shell环境,可以在Windows系统中编译和运行许多Linux应用程序和工具。

MSYS2基于MinGW-w64平台,提供了一个完整的开发环境,包括GCC编译器、GDB调试器、Make、Git版本控制系统和许多其他开发工具。除了常用的开发库和工具之外,MSYS2还提供了许多专门针对Windows平台的库和工具,方便开发人员进行跨平台开发和移植工作。

由于MSYS2拥有比较完整的Linux工具链和库,因此它成为了许多跨平台开发和移植项目的首选工具。另外,使用MSYS2也可以轻松地在Windows系统中搭建一个类似于Linux的软件开发环境,方便开发人员进行开发和调试工作。

安装 MSYS2 并安装后续编译所需的 GCC工具链 (我们希望后续使用 Mingw64 的子环境,故安装该子环境对应的 GCC 工具链),该工具链包含了 gcc编译器 、 gdb调试器 、 make 、git 等一系列所需的开发工具。

3. Cmocka源码下载编译安装 / 直接安装

源码下载编译 或 直接安装 都可配置 Cmocka,但目前在配置使用过程中,Windows 系统使用源码下载编译方法在单元测试过程中会存在找不到 Cmocka 库的问题,还得配置寻找 Cmocka 库。
故推荐在 Windows 系统下,使用直接安装的方法;在 Linux 环境下,源码下载编译 或 直接安装 均可。

3.1. Cmocka源码下载编译

访问 Cmocka 官方网站 https://cmocka.org/ 下载源码。
alt text

在 Linux 环境下,终端输入以下指令,对 Cmocka 源码进行解压、编译、安装。具体参考:https://qianchenzhumeng.github.io/posts/cmocka_tutorial/

tar -xvJf cmocka-1.1.3.tar.xz
cd cmocka-1.1.3
mkdir build
cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Debug ..
make
sudo make install

在 Windows 环境下,终端输入以下指令,对 Cmocka 源码进行解压、编译、安装、并更新系统 Path(请注意默认的 CMocka 安装位置为:C:/Program Files (x86)/ )。具体参考:https://sam.hooke.me/note/2022/04/setting-up-cmocka/

cd cmocka
cmake -S . -B build -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Debug
cmake --build build
cmake --install build

3.2. Cmocka直接安装

MSYS2 官网直接提供了 Cmocka 安装包 https://packages.msys2.org/base/mingw-w64-cmocka,根据我们选择的开发子系统 Mingw64 选择对应的安装包,在 Ming64 终端直接输入 pacman -S mingw-w64-x86_64-cmocka 即可完成安装。
alt text

安装成功后,即可发现在 Mingw64 的 include 路径下已经包含了 Cmocka 的库文件。
alt text

4. Cmocka使用

先对 Cmocka 进行一个简单的测试使用,Cmocka 官方提供的源码中 ./example/ 路径下提供了几个测试用例。我选择了 calculator 进行测试使用。

└── cmocka-1.1.3     
    ├── AUTHORS     
    ├── build   
    ├── ChangeLog  
    ├── cmake   
    ├── CMakeLists.txt  
    ├── cmocka.pc.cmake  
    ├── cmocka-build-tree-settings.cmake.in  
    ├── cmocka-config.cmake.in  
    ├── CompilerChecks.cmake  
    ├── config.h.cmake  
    ├── ConfigureChecks.cmake  
    ├── COPYING  
    ├── coverity  
    ├── CPackConfig.cmake  
    ├── CTestConfig.cmake  
    ├── DefineOptions.cmake  
    ├── doc    
    ├── example    
    │   ├── allocate_module.c  
    │   ├── allocate_module_test.c  
    │   ├── assert_macro.c    
    │   ├── assert_macro.h  
    │   ├── assert_macro_test.c  
    │   ├── assert_module.c  
    │   ├── assert_module.h  
    │   ├── assert_module_test.c  
    │   ├── build    
    │   ├── calculator.c  
    │   ├── calculator.h  
    │   ├── calculator_test.c  
    │   ├── CMakeLists.txt  
    │   ├── database.h  
    │   ├── mock  
    │   └── simple_test.c  
    ├── include  
    ├── INSTALL.md  
    ├── NEWS  
    ├── README.md  
    ├── src  
    └── tests  

使用 cd example 命令进入目录,修改部分 calculator.c 文件代码内容,使其支持进行单元测试后,执行 gcc -o calculator calculator_test.c -lcmocka 链接 cmocka 库进行编译,编译后生成 calculator.exe 文件,运行。
alt text

最终运行结果为:进行了 22 条测试,通过 15 条测试,未通过 7 条测试。
alt text

5. 代码覆盖率

使用 gcovlcov 查看代码覆盖率。
./example/ 路径下创建 code_coverage 文件夹,cd code_coverage 进入该目录。

gcc -coverage -O0 -o calculator_test ../calculator_test.c -lcmocka
gcov ../calculator_test.c -o .
# 使用 lcov 收集当前目录下的覆盖率数据,将结果储存在 calculator_test.info 中
lcov -d . -t calculator -o calculator_test.info -b . -c
# 为 test_mocking.info 中的覆盖率数据生成 html 文档
genhtml -o output calculator.info

参考 https://qianchenzhumeng.github.io/posts/cmocka_tutorial/

若提示找不到 lcov 命令,需先输入 pacman -S lcov 对该包进行安装

alt text
alt text

最后,用浏览器打开 ./output/index.html 查看代码覆盖率报告。
alt text

posted @ 2024-04-11 13:31  likkoliu  阅读(947)  评论(0编辑  收藏  举报