找回密码
 立即注册
查看: 799|回复: 0

[其它] cmake应用 - 集成gtest进行单元测试

[复制链接]

279

主题

0

回帖

964

积分

超级版主

积分
964
发表于 2024-7-12 17:26:58 | 显示全部楼层 |阅读模式
本帖最后由 Shaw0xyz 于 2024-7-13 16:18 编辑

1. 引言

在软件开发过程中,单元测试是确保代码质量和稳定性的重要手段。Google Test(简称gtest)是一个广泛使用的C++测试框架,提供了丰富的功能和易用的接口。本文将介绍如何在CMake项目中集成gtest,进行单元测试,从环境配置到编写和运行测试用例的完整过程。

1.1 CMake简介

CMake是一个跨平台的构建系统,旨在简化项目的编译、测试和打包。它使用CMakeLists.txt文件定义项目的构建配置,并生成适合于各种平台的构建文件。

1.2 Google Test简介

Google Test是一个用于C++的开源测试框架,提供了一组简单而强大的断言(assertions),用于编写和运行单元测试。它支持自动化测试、参数化测试和多线程测试,适用于各种规模的项目。

2. 环境配置

2.1 安装CMake

从CMake官方网站下载并安装最新版本的CMake。安装完成后,可以通过以下命令检查CMake版本:

  1. cmake --version
复制代码


2.2 安装Google Test

有多种方式可以在项目中使用gtest,最常见的是通过Git子模块或包管理器安装。本文将介绍如何通过Git子模块的方式集成gtest。

在项目根目录下运行以下命令,将gtest添加为子模块:

  1. git submodule add <a href="https://github.com/google/googletest.git" target="_blank">https://github.com/google/googletest.git</a>
  2. git submodule update --init
复制代码


3. 配置CMakeLists.txt

在项目的CMakeLists.txt文件中,添加对gtest的支持。

3.1 引入gtest

在CMakeLists.txt文件中,引入gtest和gtest_main库:

  1. add_subdirectory(googletest)
  2. include_directories(${gtest_SOURCE_DIR}/include ${gtest_SOURCE_DIR})
复制代码


3.2 添加测试目标

假设项目中有一个名为`my_project`的目标,下面的示例展示了如何添加一个名为`runTests`的测试目标:

  1. add_executable(runTests test_main.cpp)
  2. target_link_libraries(runTests gtest gtest_main)
复制代码


4. 编写测试用例

在项目的测试目录中,创建一个名为`test_main.cpp`的文件,并编写测试用例。

4.1 示例测试用例

下面是一个简单的测试用例,测试一个加法函数:

  1. #include <gtest/gtest.h>

  2. // 被测试的加法函数
  3. int add(int a, int b) {
  4.     return a + b;
  5. }

  6. // 测试用例
  7. TEST(AddTest, PositiveNumbers) {
  8.     EXPECT_EQ(add(1, 2), 3);
  9. }

  10. TEST(AddTest, NegativeNumbers) {
  11.     EXPECT_EQ(add(-1, -2), -3);
  12. }

  13. int main(int argc, char **argv) {
  14.     ::testing::InitGoogleTest(&argc, argv);
  15.     return RUN_ALL_TESTS();
  16. }
复制代码


5. 运行测试

使用以下命令构建项目并运行测试:

  1. mkdir build
  2. cd build
  3. cmake ..
  4. make
  5. ./runTests
复制代码


运行结果将显示测试用例的执行情况,包括通过和失败的测试。

6. 高级配置

6.1 参数化测试

gtest支持参数化测试,可以用来测试一组不同输入下的函数行为。下面是一个参数化测试的示例:

  1. #include <gtest/gtest.h>

  2. class AddTest : public ::testing::TestWithParam<std::tuple<int, int, int>> {};

  3. TEST_P(AddTest, HandlesVariousInputs) {
  4.     int a, b, expected;
  5.     std::tie(a, b, expected) = GetParam();
  6.     EXPECT_EQ(add(a, b), expected);
  7. }

  8. INSTANTIATE_TEST_SUITE_P(AddTestInstantiation, AddTest,
  9.     ::testing::Values(
  10.         std::make_tuple(1, 2, 3),
  11.         std::make_tuple(-1, -2, -3),
  12.         std::make_tuple(0, 0, 0)
  13.     ));

  14. int main(int argc, char **argv) {
  15.     ::testing::InitGoogleTest(&argc, argv);
  16.     return RUN_ALL_TESTS();
  17. }
复制代码


6.2 生成测试报告

可以使用CTest生成测试报告。首先,在CMakeLists.txt文件中启用测试支持:

  1. enable_testing()
  2. add_test(NAME runTests COMMAND runTests)
复制代码


然后,使用以下命令运行所有测试并生成报告:

  1. ctest
复制代码


7. 总结

本文介绍了如何在CMake项目中集成gtest进行单元测试,包括环境配置、编写测试用例、运行测试和高级配置。通过这种方式,开发者可以高效地进行C++项目的单元测试,确保代码的质量和稳定性。希望本文能为您在实际项目中提供有用的参考。









/ 荔枝学姐de课后专栏 /

Hi!这里是荔枝学姐~

欢迎来到我的课后专栏

自然语言学渣 NLP摆烂姐

热衷于技术写作 IT边角料

AIGC & Coding & linux ...

~互撩~ TG: @Shaw_0xyz
荔枝学姐爱吃荔枝!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

联系站长|Archiver|手机版|小黑屋|主机论坛

GMT+8, 2025-4-3 16:44 , Processed in 0.062938 second(s), 24 queries .

Powered by 主机论坛 HostSsss.Com

HostSsss.Com

快速回复 返回顶部 返回列表