当前位置: 首页 > news >正文

VS Code集成googletest-C/C++单元测试Windows

环境准备

  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_testcalculate_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
http://www.dtcms.com/a/561251.html

相关文章:

  • Vue 图片性能优化双剑客:懒加载与自动压缩实战指南
  • 网站之家查询qq空间网站是多少
  • Elasticsearch 与 Faiss 联合驱动自动驾驶场景检索:高效语义匹配 PB 级视频数据
  • 短租网站开发学术ppt模板免费
  • 设计模式——单例模式(singleton)
  • 【计算机软件资格考试】软考综合知识题高频考题及答案解析1
  • 计算机网络自顶向下方法25——运输层 TCP流量控制 连接管理 “四次挥手”的优化
  • LeetCode【高频SQL基础50题】
  • 清远做网站的有哪些wordpress判断浏览器
  • 自己做的网站怎样才有网址浏览找人做网站域名怎么过户
  • JavaScript中的闭包:原理与实战
  • 怎么看一个网站是否被k怎么找项目
  • 交易网站开发做的比较好的p2p网站
  • JavaScript异步编程:从回调地狱到优雅解决方案
  • 【MATLAB】matlab闪退问题(随时更新)
  • 有专门做最佳推荐的网站东莞网站制作十年乐云seo
  • React中的stopPropagation和preventDefault
  • React Hooks:提升前端开发效率的关键
  • Apache Tomcat 介绍
  • 国网公司网站建设宠物网站的目的
  • 怎么找做网站的外包公司二级域名是什么
  • CentOS 7/8/9 一键安装 Python 3.10+ 并配置默认版本
  • Harmony鸿蒙开发0基础入门到精通Day08--JavaScript篇
  • OpenCV(十八):绘制文本
  • Arbess实践指南(3) - 使用Arbess+sourcefare+PostIn实现Java项目自动化部署 + 代码扫描 + 接口自动化测试
  • 一,PCB介绍
  • 重庆网站建设机构科技进步是国防强大的重要的保证
  • asp网站用什么数据库做网站怎么导入源码
  • 【Docker】容器操作和实战
  • 阿里巴巴网站如何做免费推广wordpress首页文章轮播