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. 代码覆盖率

使用 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 对该包进行安装



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

Cmocka 单元测试配置与使用的更多相关文章

  1. Android studio下gradle Robolectric单元测试配置

    android studio下gradle Robolectric单元测试配置 1.Robolectric Robolectric是一个基于junit之上的单元测试框架.它并不依赖于Android提供 ...

  2. springmvc,springboot单元测试配置

    1. springmvc单元测试配置 <dependency> <groupId>junit</groupId> <artifactId>junit&l ...

  3. phpstorm laravel单元测试 配置

    laravel中集成了单元测试工具phpunit可以在项目的根目录下进行使用,命令是:phpunti ./tests/单元测试文件名称.在phpstorm中使用phpunit需要做一些配置,指定com ...

  4. JUnit 单元测试 配置

    选中工程,右键  built path , add liberaries , JUnit , JUnit4 这样就不用每次测试时都在main方法中写了

  5. angular单元测试与自动化UI测试实践

    关于本文:介绍通过karma与jsmine框架对angular开发的应用程序进行单元与E2E测试. angular单元测试与集成测试实践 先决条件 创建项目 webstorm中创建空白web项目 创建 ...

  6. Unit Test单元测试时如何模拟HttpContext

    参考文章:http://blog.csdn.net/bclz_vs/article/details/6902638 http://www.cnblogs.com/PurpleTide/archive/ ...

  7. spring下配置dbcp,c3p0,proxool[转]

    不管通过何种持久化技术,都必须通过数据连接访问数据库,在Spring中,数据连接是通过数据源获得的.在以往的应用中,数据源一般是Web应用服务器提供的.在Spring中,你不但可以通过JNDI获取应用 ...

  8. Android Studio gradle配置详解

    android gradle配置详解 AppExtension类及其属性 可能大部分人看到AppExtension类会感觉到非常的陌生,其实我们在app中的build.gradle中填写配置信息的时候 ...

  9. 在vscode成功配置Python环境

    注意:如果您希望在Visual Studio Code中开始使用Python,请参阅教程.本文仅关注设置Python解释器/环境的各个方面. Python中的“环境”是Python程序运行的上下文.环 ...

  10. vue 单元测试

    单元测试 配置和工具 任何兼容基于模块的构建系统都可以正常使用,但如果你需要一个具体的建议,可以使用Karma进行自动化测试.它有很多社区版的插件,包括对webpack和browserify的支持. ...

随机推荐

  1. Python with 语句的用法

    with 语句是Python中用于简化资源管理的一种语法结构,通常与上下文管理器(Context Manager)一起使用.上下文管理器提供了一种机制,用于确保资源在使用完毕后能够被正确释放,例如文件 ...

  2. 【Azure Policy】使用deployIfNotExists 把 Azure Activity logs 导出保存在Storage Account

    问题描述 使用Azure Policy,对订阅下的全部Activity Log配置Diagnostic Setting,要求: 在Subscription或Management Group级别,针对未 ...

  3. LLM

    LangChain 是啥,能干啥? AutoChain 又是啥 近年来的LLM模型 LLM 都是基于transformers 结构的,具体又分为 Encoder-only(Autoencoding), ...

  4. 第一个鸿蒙程序Hello Word

    DevEco Studio介绍 HUAWEI DevEco Studio(以下简称DevEco Studio)是基于IntelliJ IDEA Community开源版本打造,面向华为终端全场景多设备 ...

  5. Identity – user login, forgot & reset password, 2fa, external login, logout 实战篇

    前言 之前写过一篇 Identity – User Login, Forgot Password, Reset Password, Logout, 当时写的比较简陋, 今天有机会就写多一篇实战版. 建 ...

  6. .NET 开源工业级移动端仓库管理系统

    前言 在工业生产中,定制化的软件对于每个环节都至关重要.对于仓库管理,推荐一款开源的仓库管理系统(WMS)解决方案. 这款基于.NET 框架开发的移动应用,提供了全面的仓库操作.订单处理.主数据管理. ...

  7. Flutter Engage China 开发者常见问题解答 | 下篇

    再次感谢大家对 Flutter Engage China 活动 的关注和积极参与!我们在活动前后收到了很多来自开发者的反馈和问题,Flutter 团队和演讲嘉宾在直播 Q&A 环节中也针对部分 ...

  8. laravel框架中保留条件搜索

    前段代码 <form action="admin_index" method="get"> <input type="text&qu ...

  9. Java日期时间API系列28-----Jdk8中java.time包中的新的日期时间API类,计算节假日和二十四节气。

    1.节日信息计算代码 package com.xkzhangsan.time.holiday; import java.time.DayOfWeek; import java.time.LocalDa ...

  10. Java日期时间API系列25-----Jdk8中java.time包中的新的日期时间API类,使用MonthDay计算十二星座。

    通过Java日期时间API系列24-----Jdk8中java.time包中的新的日期时间API类,MonthDay类源码和应用,对比相同月日时间.对MonthDay简单做了说明和应用.十二星座是根据 ...