环境准备

  1. 下载好**MinGW和配置好其环境变量,参考上一篇文章**
  2. VS Code下载好CMake的插件
  3. 下载好googletest的源码,在github上直接搜即可

VScode的目录结构和代码

目录结构

build文件夹现在为空

其实这里的目录结构并不重要,后续在 CMakeLists.txt 中进行对应即可(可以按照自己的想法建目录存放源代码与测试代码,也可以参考我的)

.vscode

c_cpp_properties.json

{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "windowsSdkVersion": "10.0.22621.0",
            "compilerPath": "E:\\msys64\\ucrt64\\bin\\gcc.exe",
            "cStandard": "c17",
            "cppStandard": "c++17",
            "intelliSenseMode": "gcc-x64"
        },
        {
            "name": "C++",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "windowsSdkVersion": "10.0.22621.0",
            "compilerPath": "E:\\msys64\\ucrt64\\bin\\g++.exe",
            "cStandard": "c17",
            "cppStandard": "c++17",
            "intelliSenseMode": "gcc-x64"
        }
    ],
    "version": 4
}

launch.json

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) 启动 (CMake)",
            "type": "cppdbg",
            "request": "launch",
            
            // 1. 核心修改:程序路径指向 CMake 的构建输出
            // ${PROJECT_NAME} 必须和你 CMakeLists.txt 里的 project() 名称一致
            "program": "${workspaceFolder}/build/calculate.exe",
            
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}", // 工作目录
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "E:\\msys64\\ucrt64\\bin\\gdb.exe",           

            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "将反汇编风格设置为 Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

src

add.h

#ifndef __ADD_H_
#define __ADD_H_

int add(int a, int b);

#endif  // __ADD_H_

add.c

#include <stdio.h>
#include "../include/add.h"

//加法
int add(int a, int b)
{
    return a+b;
}

main.c

#include <stdio.h>
#include "add.h"

int main()
{
    int a=3, b=4;
    printf("a+b= %d\n",add(a, b));
}

unittest

googletest

这里面存放goolgetest的源码,github下载的源码解压后粘贴进来即可,注意解压后源码自带的CMakeLists.txt在googletest目录下。

calculate_test.cpp

在unittest的testcase的calculate_test目录下,单元测试代码

#include "gtest/gtest.h"
#include "gmock/gmock.h"

extern "C"{
#include "add.h"
}


TEST(ARRAY_TEST, calculate_test) {
    int a=3,b=4;
    EXPECT_EQ(7, add(a, b));
}

#if 1
int main(int argc, char *argv[])
{
  testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}
#endif

CMakeLists.txt

在unittest的testcase的calculate_test目录下

# 创建测试可执行文件
add_executable(calculate_test
    calculate_test.cpp
)

# 链接2个目标:
# 1. lib_calculate: 你自己的 C 语言库 (包含 add 函数)
# 2. gmock_main,自动拉入 gmock、gtest 和 main 函数
target_link_libraries(calculate_test PRIVATE 
    lib_calculate 
    gmock_main
)

# 将这个可执行文件注册为一个 "Test"
# 这样你就可以使用 ctest 命令来运行它
add_test(NAME CalculateTest COMMAND calculate_test)

CMakeLists.txt

在E:\win-googletest目录下,为最外层的CMakeLists.txt

cmake_minimum_required(VERSION 3.16)
# 启用 C 和 CXX (C++) 两种语言
project(GTESTWIN LANGUAGES C CXX)

# 启用 CTest,方便后续运行测试
enable_testing()

# 添加 include 目录,让主程序和测试都能找到 "add.h"
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/src/calculate/include")

# --- 1. 构建计算库 (lib_calculate) ---
# 查找 src/calculate 目录下的源文件 (add.c)
AUX_SOURCE_DIRECTORY("${CMAKE_CURRENT_SOURCE_DIR}/src/calculate" DIR_CALC_SRCS)

# 将 add.c 编译为一个静态库 (STATIC Library)
add_library(lib_calculate STATIC ${DIR_CALC_SRCS})

# --- 2. 构建主程序 (calculate.exe) ---
# 编译 main.c
add_executable(calculate src/main.c)

# 将主程序链接到计算库
target_link_libraries(calculate PRIVATE lib_calculate)

# --- 3. 构建 GoogleTest ---
# 添加 googletest 子目录
add_subdirectory(unittest/googletest)

# (可选, 推荐) 设置 gtest 默认不编译,除非有测试依赖它
set_target_properties(gtest gtest_main PROPERTIES EXCLUDE_FROM_ALL TRUE)

# --- 4. 构建你的单元测试 ---
# 添加你的测试案例所在的子目录
add_subdirectory(unittest/testcase/calculate_test)

编译

选中最外层的CMakeLists.txt,点击build即可。

结果

  1. googletest生成的静态库在lib目录下
  2. 要测试的代码生成的lib是liblib_calculate.a
  3. calculate.exe就是src下的main.c函数和其它依赖生成的可执行exe程序
  4. calculate_test.exe就是unittest的testcase的calculate_test目录下的calculate_test.cpp和其它依赖生成的可执行exe程序

测试效果

有以下三种方式可以进行单元测试的验证

1)烧杯直接运行

2)直接运行ctest

3)直接运行exe

AI补充单元测试

#include "gtest/gtest.h"
#include "gmock/gmock.h"
#include <limits.h>

extern "C"{
#include "add.h"
}

TEST(ARRAY_TEST, calculate_test) {
    int a = 3, b = 4;
    EXPECT_EQ(7, add(a, b));
}

TEST(AddTest, ZeroCases) {
    EXPECT_EQ(0, add(0, 0));
    EXPECT_EQ(5, add(0, 5));
    EXPECT_EQ(-5, add(-5, 0));
}

TEST(AddTest, NegativeNumbers) {
    EXPECT_EQ(-7, add(-2, -5));
    EXPECT_EQ(-1, add(2, -3));
}

TEST(AddTest, CommutativeProperty) {
    int a = 12345;
    int b = -678;
    EXPECT_EQ(add(a, b), add(b, a));
}

TEST(AddTest, LargeValuesWithinRange) {
    EXPECT_EQ(3000000, add(1000000, 2000000));
}

TEST(AddTest, IntLimitsNoOverflow) {
    EXPECT_EQ(INT_MAX, add(INT_MAX, 0));
    EXPECT_EQ(INT_MIN, add(INT_MIN, 0));
}

#if 1
int main(int argc, char *argv[])
{
  testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}
#endif
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐