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的支持. ...
随机推荐
- vue grid layout 设定某组件为最低位,其它子item无法拖拽超过
逻辑: 设定某项X为底部 逻辑: for 循环获取最低位的item Y的信息:i 和 y 如果i != X.i initY = X.y 则调整X.y ...
- c程序设计语言 by K&R(五)UNIX系统接口
一.文件描述符 在unix操作系统中,所有的外围设备(包括键盘和显示器)都被看作是文件系统的文件,因此,所有的输入.输出都要通过读/写文件来完成.也就是说,通过一个单一的接口就可以处理外围设备和程序之 ...
- EF Core – Get Started 搭建单侧环境
有时候想搭个环境做测试, 又记不住那些 command, 官方教程又啰嗦. git clone 模板又不太好管理, 索性记入在这里吧. 创建项目 dotnet new webapp -o Simple ...
- C语言数据类型、变量的输入和输出、进制转换
scanf标准函数可以从键盘得到数字并记录到存储区里,为了使用这个标准函数需要包含stdio.h这个头文件 在scanf函数调用语句里应该使用存储区的地址表示存储区:双引号里使用占位符表示存储区的类型 ...
- springboot多文件上传、删除、下载到项目本地
package com.example.demo.document; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.IoUti ...
- VMWARE 客户机 ARP 问题一则
最近测试自定义的 linux 镜像,会在 vmware 里面反复安装.测试过程中,发现一个奇怪的现象,就是刚装好的虚拟机,要主动往外ping一下,才能被网络上其他主机连接上.否则就算是同一子网下的宿主 ...
- excel江湖异闻录--◆K
网名◆K,按照群里同学的说法,K神和老大kluas,以及一个名为KKK的VBA强人,都是K字头家族的高手. 因为函数实力极强,时常碾压难题,被群里同学们冠以了"K神"的称号. 用笔 ...
- 如何让img图片居中
说明:img是行内块元素,用一个盒子(父元素)嵌套img(子元素) text-align:center;可以让父元素为块元素的行内块或行内元素水平居中: vaertical-align:middle; ...
- js的作用域有哪些 and 他们的特点
全局作用域:是所有代码的执行环境,比如script标签里所有的代码 或 独立的js 文件: 局部作用域:是函数内部代码的执行环境: 块级作用域:是 {} 内的代码执行环境:
- C#的引用类型
引用类型的基类为 Object 引用类型:类Class.接口Interface.委Delegrate.数组Array