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/ 下载源码。
在 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
即可完成安装。
安装成功后,即可发现在 Mingw64 的 include 路径下已经包含了 Cmocka 的库文件。
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
文件,运行。
最终运行结果为:进行了 22 条测试,通过 15 条测试,未通过 7 条测试。
5. 代码覆盖率
使用 gcov
和 lcov
查看代码覆盖率。
在 ./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
对该包进行安装。
最后,用浏览器打开 ./output/index.html
查看代码覆盖率报告。