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
查看代码覆盖率报告。
Cmocka 单元测试配置与使用的更多相关文章
- Android studio下gradle Robolectric单元测试配置
android studio下gradle Robolectric单元测试配置 1.Robolectric Robolectric是一个基于junit之上的单元测试框架.它并不依赖于Android提供 ...
- springmvc,springboot单元测试配置
1. springmvc单元测试配置 <dependency> <groupId>junit</groupId> <artifactId>junit&l ...
- phpstorm laravel单元测试 配置
laravel中集成了单元测试工具phpunit可以在项目的根目录下进行使用,命令是:phpunti ./tests/单元测试文件名称.在phpstorm中使用phpunit需要做一些配置,指定com ...
- JUnit 单元测试 配置
选中工程,右键 built path , add liberaries , JUnit , JUnit4 这样就不用每次测试时都在main方法中写了
- angular单元测试与自动化UI测试实践
关于本文:介绍通过karma与jsmine框架对angular开发的应用程序进行单元与E2E测试. angular单元测试与集成测试实践 先决条件 创建项目 webstorm中创建空白web项目 创建 ...
- Unit Test单元测试时如何模拟HttpContext
参考文章:http://blog.csdn.net/bclz_vs/article/details/6902638 http://www.cnblogs.com/PurpleTide/archive/ ...
- spring下配置dbcp,c3p0,proxool[转]
不管通过何种持久化技术,都必须通过数据连接访问数据库,在Spring中,数据连接是通过数据源获得的.在以往的应用中,数据源一般是Web应用服务器提供的.在Spring中,你不但可以通过JNDI获取应用 ...
- Android Studio gradle配置详解
android gradle配置详解 AppExtension类及其属性 可能大部分人看到AppExtension类会感觉到非常的陌生,其实我们在app中的build.gradle中填写配置信息的时候 ...
- 在vscode成功配置Python环境
注意:如果您希望在Visual Studio Code中开始使用Python,请参阅教程.本文仅关注设置Python解释器/环境的各个方面. Python中的“环境”是Python程序运行的上下文.环 ...
- vue 单元测试
单元测试 配置和工具 任何兼容基于模块的构建系统都可以正常使用,但如果你需要一个具体的建议,可以使用Karma进行自动化测试.它有很多社区版的插件,包括对webpack和browserify的支持. ...
随机推荐
- animate动画库的使用
在vue中便捷使用animate动画库效果. 安装animate动画库 npm install animate.css --save 在vue跟目录中 main.js 导入animate动画库 imp ...
- docker高级篇第二章-分布式存储之实战案例:主从容错切换迁移案例
在上一篇,学会了3主3从的Redis集群搭建.那么接下来,我们就来学习Redis集群主从容错切换迁移案例 本次案例从模拟两个场景 1:数据读写存储 a:一个新key数据来了,是否会按照预设的进入槽中? ...
- 牛逼!Vue3.5的useTemplateRef让ref操作DOM更加丝滑
前言 vue3中想要访问DOM和子组件可以使用ref进行模版引用,但是这个ref有一些让人迷惑的地方.比如定义的ref变量到底是一个响应式数据还是DOM元素?还有template中ref属性的值明明是 ...
- Pytorch数据加载与使用
前言 在训练的时候通常使用Dataset来处理数据集. Dataset的作用 提供一个方式获取数据内容和标签(label). 实战 from torch.utils.data import Datas ...
- PTA甲级—图
1.图的遍历 1013 Battle Over Cities (25 分) 一种方法使用dfs求连通块的个数 #include <cstdio> #include <cstring& ...
- 基于全息感知的智慧高速IT设施监控运维方案
作为智能交通的重要细分领域,建设智慧高速是实施交通强国战略的重要基础.在信息化时代,交通行业已经依托信息化建设取得了显著的成果,其中以收费网络.办公网络.监控网络和通讯网络为基础的网络架构已经形成,并 ...
- 智能化IT运维平台建设方案,基于智和信通运维体系的高敏捷二次开发
随着企业信息进程不断加速,运维人员需要面对越来越复杂的业务和越来越多样化的用户需求,不断扩展的应用需要越来越合理的模式.越来越智能的工具来保障运维能灵活便捷.安全稳定地开展.企业网络规模的不断扩大,从 ...
- PasteForm最佳CRUD实践,实际案例PasteTemplate详解之3000问(四)
无论100个表还是30个表,在使用PasteForm模式的时候,管理端的页面是一样的,大概4个页面, 利用不同操作模式下的不同dto数据模型,通过后端修改对应的dto可以做到控制前端的UI,在没有特别 ...
- argmax经过sigmoid和不经过sigmoid区别
起因 今天和同组讨论了一下网络输出时,在torch.argmax之前经过torch.sigmoid和不经过sigmoid的区别. 主要起因是实验结果图像不同 图1 不经过sigmoid 图2 经过si ...
- yaml.load与yaml.dump的用法
import yaml #向yaml文件中写 with open("E:\个人\ rename.yaml", 'w') as f: project = {'在远方':"1 ...