首页 > 其他分享 >C代码单元测试框架

C代码单元测试框架

时间:2024-11-08 11:11:28浏览次数:1  
标签:框架 编译 代码 单元测试 CMocka unity cmocka test void

如何在Windows本地集成unity和CMocka单元测试框架?

 

一、Cmocka源码下载编译

   官方网站 https://cmocka.org/ 下载源码。

     CMocka 使用 CMake 来管理构建过程,它能自动生成适用于 MinGW 的构建文件(MinGW Makefiles)。如果你想要在 Windows 上使用MinGW 编译 CMocka则需要用到CMake工具。

     CMake 是一个构建系统生成工具,它的作用是帮助你生成适用于不同平台的构建文件,如: Makefile。

     MinGW 是一个编译工具链,提供了 GCC 编译器等工具,用于在 Windows 上编译 C、C++ 等程序。

二、下载和安装 MinGW

  1、下载:访问 MinGW官方网站。 Download File List - MinGW - Minimalist GNU for Windows - OSDN

    

  2、安装配置

    安装时,确保选择以下组件(选择后点击apply应用继续安装):  

    (1)、mingw32-base:基础开发工具。

    (2)、mingw32-gcc-g++:C 和 C++ 编译器。

    (3)、(可选)mingw32-msys-base:如果你希望使用类似 Unix 的环境,可以选择安装。

  3、设置环境变量

 

    安装完成后,你需要将 MinGW 的 bin 目录添加到系统的环境变量 中,这样你就可以在任何位置使用 MinGW 编译工具。

 

    (1)、右键点击“此电脑”或“计算机”,选择“属性”。

    (2)、点击“高级系统设置”,然后选择“环境变量”。

    (3)、在 系统变量 中找到 Path,点击“编辑”。

    (4)、在编辑窗口中,点击“新建”并添加 MinGW 安装路径下的 bin 目录,例如:C:\MinGW\bin(根据你实际的安装路径)。

    (5)、保存并退出。

   4、测试安装成功

    (1)、打开 命令提示符(cmd)。

    (2)、输入  gcc --version  命令来检查 GCC 是否安装成功

三、下载和安装 CMake

  1、下载 CMake:访问 CMake 的 下载页面,并下载适合 Windows 的安装包。  Download CMake

    

安装时可以选择 Add CMake to system PATH(将 CMake 添加到系统 PATH),这样你可以在命令行中直接使用 cmake 命令。

   2、验证安装:安装完成后,你可以在命令行中运行以下命令,确认 CMake 是否安装成功:     (1)、cmake --version (如果找不到可以尝试重新开启cmd命令提示框)

四、使用 CMake 构建 CMocka

  1、进入你下载的 CMocka 源代码目录:

    cd path/to/cmocka

  2、创建一个新的构建目录:

    mkdir build

    cd build

  3、使用 CMake 配置构建过程:

    cmake ..

    (1)、如果你希望指定 MinGW 编译器,可以使用 -G 选项来告诉 CMake 使用 MinGW 构建。例如:

         cmake -G "MinGW Makefiles" ..

         这将告诉CMake使用MinGW的make工具生成Makefile.

  4、开始构建 CMocka:

    make

  5、开始安装 CMocka:

    make install

   6、常见错误提示

    提示:CMake Error at cmake_install.cmake:41 (file): file cannot create directory: C:/Program Files (x86)/cmocka/lib/pkgconfig. Maybe need administrative privileges.

      此时需要已管理员方式运行你的终端,windows下可以在搜索框中搜索cmd,在弹出的运用程序中选择以管理员方式运行。

   7、如果构建成功,CMocka 的库文件将被生成。

    库文件生成目录:文件将被安装到 C:/Program Files (x86)/cmocka/ 目录中。

五、验证CMocka是否安装成功

  构建和安装完成后,你可以通过以下步骤验证 CMocka 是否安装成功。

  1、在终端中检查 CMocka 库是否被安装到正确的位置。

  2、编译运行测试程序

    (1)、创建一个 test_example.c 文件:

#include <cmocka.h>

static void test_example(void **state) {
    (void) state;  // unused variable
    assert_int_equal(1, 1);  // Example test: asserts that 1 == 1
}

int main(void) {
    const struct CMUnitTest tests[] = {
        cmocka_unit_test(test_example),
    };
    return cmocka_run_group_tests(tests, NULL, NULL);
} 

    (2)、用 MinGW 编译并运行测试(windows搜索框中搜索cmd,以管理员方式运行):

        gcc -o test_example test_example.c -lcmocka

        也能写makefile自动编译运行

# Makefile for testing with CMocka

# 编译器和编译选项
CC = gcc
# CMocka 的头文件路径
CFLAGS = -Wall -std=c99 -I"C:/Program Files (x86)/cmocka/include" 
# CMocka 的库文件路径
LDFLAGS = -L"C:/Program Files (x86)/cmocka/lib" -lcmocka  

# 目标可执行文件
TARGET = test_program.exe

# 源文件
#SRCS = test_program.c

# 自动查找当前目录下的所有 .c 文件  不仅是test_program.c文件,还包含了库里的其它C文件
SRCS = $(wildcard *.c)

# 目标文件
OBJS = $(SRCS:.c=.o)

# 默认目标
all: $(TARGET)

# 编译可执行文件
$(TARGET): $(OBJS)
    $(CC) $(OBJS) $(LDFLAGS) -o $(TARGET)

# 编译源文件
%.o: %.c
    $(CC) $(CFLAGS) -c $< -o $@

# 清理目标
# Windows 删除命令
clean:
    del $(OBJS) $(TARGET)  

# 运行程序
run: $(TARGET)
# 运行生成的 .exe 文件
    ./$(TARGET)  

         

  3、常见错误提示

    (1)、提示找不到头文件时使用绝对路劲:gcc -I"C:/Program Files (x86)/cmocka/include" -L"C:/Program Files (x86)/cmocka/lib" -o test_example test_example.c -lcmocka

    (2)、使用绝对路劲如果报错cmocka.h下各种错误,证明测试程序已经能找到cmocka.h了。此时我们进入C:/Program Files (x86)/cmocka/include 下找到cmocka.h,打开源代码发现提示使用时必须包含提供的头文件。在源代码头部添加后编译没有报错。

          

    (3)、由于找不到cmocka.dll,无法继续执行代码。重新安装程序可能会解决此问题。

        但我们查询到这个文件在C:\Program Files (x86)\cmocka\bin 目录下,将此路径添加到系统环境变量path下即可。

  4、运行测试程序:

    编译成功会在同路劲下生成 test_example.exe文件,在cmd下运行命令:test_example.exe ,也可以双击运行。

   windows运行:test_example.exe    linux:./test_example
  
   如果使用makefile文件编译,我们可以在cmd命令框输入make编译,make run运行编译后的.exe程序,make clean来清空编译生成的.o和.exe文件。   
  
   成功运行如下:

        

六、下载 Unity 测试框架源代码

  只需unity.c  unity.h  unity_internals.h即可

   下载:访问 Unity GitHub 页面

      (1)、点击 "Code" 按钮,然后选择 "Download ZIP" 进行下载。

      (2)、解压缩下载的文件到你选择的目录。

                  

 七、在CMocka的工程上使用unity——unity集成CMocka

  1、首先将下载的unity源文件放到我们的工程路劲

    

  2、在test_example.c文件下包含unity.h头文件

    make

    提示错误:找不到unity.h头文件,我们修改makefile,增加unity.h放置的绝对路劲,如下:

    

# Makefile for testing with CMocka

# 编译器和编译选项
CC = gcc
# CMocka 的头文件路径
CFLAGS = -Wall -std=c99 -I"C:/Program Files (x86)/cmocka/include" -I D:/CMocka/test/unity_cmocka_test 
# CMocka 的库文件路径
LDFLAGS = -L"C:/Program Files (x86)/cmocka/lib" -lcmocka  

# 目标可执行文件
TARGET = test_program.exe

# 源文件
#SRCS = test_program.c

# 自动查找当前目录下的所有 .c 文件
SRCS = $(wildcard *.c)

# 目标文件
OBJS = $(SRCS:.c=.o)

# 默认目标
all: $(TARGET)

# 编译可执行文件
$(TARGET): $(OBJS)
    $(CC) $(OBJS) $(LDFLAGS) -o $(TARGET)

# 编译源文件
%.o: %.c
    $(CC) $(CFLAGS) -c $< -o $@

# 清理目标
# Windows 删除命令
clean:
    del $(OBJS) $(TARGET)  

# 运行程序
run: $(TARGET)
# 运行生成的 .exe 文件
    ./$(TARGET)  

  3、执行编译指令:make

        报错如下:证明已经能正确找到unity.h头文件

              unity.o:unity.c:(.text+0x26e4):    undefined reference to `setUp'

              unity.o:unity.c:(.text+0x26fe):     undefined reference to `tearDown'

    这两个接口需要我们自己实现在主函数里,用于执行测试用例前后的操作。执行前就可以用CMocka模拟参数传入测试用例了。

 1 #include <stdarg.h>
 2 #include <stddef.h>
 3 #include <stdint.h>
 4 #include <setjmp.h>
 5 #include <stdint.h>
 6 
 7 #include <cmocka.h>
 8 
 9 #include <unity.h>
10 
11 // setUp 函数在每个测试用例之前执行
12 void setUp(void) {
13     // 初始化工作,例如分配内存、初始化变量等
14 }
15 
16 // tearDown 函数在每个测试用例之后执行
17 void tearDown(void) {
18     // 清理工作,例如释放内存、重置状态等
19 }
20 
21 static void test_example(void **state) {
22     (void) state;  // unused variable
23     assert_int_equal(1, 1);  // Example test: asserts that 1 == 1
24 }
25 
26 void check_unity_test(void);//unity单元测试
27 int main(void) {
28     /*unity*/
29     UNITY_BEGIN();
30     RUN_TEST(check_unity_test);
31     UNITY_END();
32     
33     /*CMocka*/
34     const struct CMUnitTest tests[] = {
35         cmocka_unit_test(test_example),
36     };
37     
38     return cmocka_run_group_tests(tests, NULL, NULL);
39 }
40 
41 void check_unity_test(void){
42     int i=0;
43     for(i=0;i<10;i++){
44         if(i == 5){
45             printf("hello world!\n");
46             break;
47         }
48     }
49 }

  4、CMocka集成到unity下成功运行如下

 

八、强制为现有目录启用 8.3 文件名

  有时我们在输入C:\Program Files (x86) 这种文件名时,因为有空格,有些编译器识别不了,需要其它操作,windows下这类文件目录对应一个短文件名,如何使用呢?

  你可以使用 fsutil 工具来强制更新现有目录的 8.3 文件名。按以下步骤操作:

  1、打开 命令提示符(以管理员身份运行)。

  2、输入以下命令以强制重新生成 C:\Program Files (x86) 目录下的 8.3 文件名:

    fsutil 8dot3name set C:\Program Files (x86) 0

  使用 dir /x 命令

    完成上述步骤后,运行 dir /x 命令查看目录内容时,应该可以看到 8.3 文件名了。例如:

      

    虽然 Progra~2 是 Program Files (x86) 的短路径表示法,但并不是所有的工具或者环境都能够正确解析这种表示法。如果还是发现引用不到路劲中的头文件,就使用“path/./..”方法。

 

 

 

  

 

 

标签:框架,编译,代码,单元测试,CMocka,unity,cmocka,test,void
From: https://www.cnblogs.com/gengtongyu/p/18530457

相关文章

  • 代码随想录算法训练营第二十天|leetcode235. 二叉搜索树的最近公共祖先、leetcode701.
    1leetcode235.二叉搜索树的最近公共祖先题目链接:235.二叉搜索树的最近公共祖先-力扣(LeetCode)文章链接:代码随想录视频链接:二叉搜索树找祖先就有点不一样了!|235.二叉搜索树的最近公共祖先_哔哩哔哩_bilibili思路:用之前一样的方法,哈哈哈哈哈,好处就是做出来了,但是我觉得需......
  • CommunityToolkit.Mvvm框架
    .NETWPFCommunityToolkit.Mvvm框架1源生成器1.1ObservablePropertyAttribute&RelayCommandAttributeusingCommunityToolkit.Mvvm.ComponentModel;usingCommunityToolkit.Mvvm.Input;usingSystem.Windows;namespaceTestCommunityToolkit._1_Attribute{pub......
  • Mybatis框架入门
    IDEA使用Maven部署第一个MyBatis项目,两种方法导入,一个是Jar包的形式,此形式用于初学者学习并完成学校实训作业,第二种则是通过pom.xml文件引入依赖从而避免了从官网下载jar包等问题。一、创建一个Maven工程:File-->New-->projcet-->Maven二、导入以下Jar包:New-->ProjcetStruc......
  • Next.js 实战开发入门教程敏捷开发框架
    在上一篇文章中,我们已经成功实现了网站的导航栏。接下来,我们将继续开发网页的主体部分,用于展示我们的网站业务情况。主页内容展示首先,我们需要创建一个名为 /app/components/Main.tsx 的文件,作为主页内容的入口。然后在根目录的 /app/page.tsx 中引入这个组件,这样在访问主页......
  • 3分钟Opencv人脸识别教程-超级简单(30行代码左右)
    一、下载Opencv源码并使用CMake构建工具编译源码?Opencv源码地址:https://opencv.org/releases/ Github的Opencv地址:GitHub-opencv/opencv:OpenSourceComputerVisionLibrary1、本文用到的所有文件包括opencv编译好的源码https://pan.baidu.com/s/1ZINU8pbva1vur5G......
  • 代码随想录算法训练营第九天|LeetCode151.翻转字符串里的单词、卡码网:55.右旋转字符串
    前言打卡代码随想录算法训练营第49期第九天︿( ̄︶ ̄)︿首先十分推荐学算法的同学可以先了解一下代码随想录,可以在B站卡哥B站账号、代码随想录官方网站代码随想录了解,卡哥清晰易懂的算法教学让我直接果断关注,也十分有缘和第49期的训练营大家庭一起进步。今日题目LeetCode151翻转字......
  • PowerShell DSC(Desired State Configuration)是一种配置管理框架,旨在通过声明性的方式
    PowerShellDSC(DesiredStateConfiguration)是一种配置管理框架,旨在通过声明性的方式自动化和管理计算机的配置。它是WindowsPowerShell的一部分,允许管理员定义和维护计算机系统的目标配置状态,而不是手动进行逐个更改。1. 什么是PowerShellDSC?PowerShellDSC是一种基于声......
  • Keras框架——卷积神经CNN神经网络~MINST手写数字识别
    一.原理说明卷积神经网络(ConvolutionalNeuralNetworks)是一种深度学习模型或类似于人工神经网络的多层感知器,常用来分析视觉图像。卷积神经网络的创始人是着名的计算机科学家YannLeCun,目前在Facebook工作,他是第一个通过卷积神经网络在MNIST数据集上解决手写数字问题的......
  • 代码随想录算法训练营 day37 day38| 卡码网52.完全背包 518. 零钱兑换 II 377.
    学习资料:https://programmercarl.com/背包问题理论基础完全背包.html#算法公开课相比于01背包,完全背包中每个物品都可以无限次的放入组合:先遍历物品,再逆序遍历背包排列:先逆序遍历背包,再遍历物品学习记录卡码网52.携带研究资料(dp[i]代表当重量为i时的最大价值)点击查看代码n......
  • PHP框架选择:如何根据项目需求选择最合适的框架PHP框架选择:如何根据项目需求选择最合适
    在开发PHP项目时,框架的选择至关重要。一个合适的PHP框架不仅能提高开发效率,还能增强代码的可维护性和可扩展性。如何根据项目需求选择合适的框架呢?以下是一些关键的考虑因素。项目的规模和复杂度是选择框架时重要的考量之一。如果是一个小型项目,可能不需要一个复杂的框架,像Slim或......