一个简单的实操学会使用cmake将googletest组织到C++工程中,进行单元测试并分析结果(附实操源码)

对于使用 CMake 将 GoogleTest 集成到 C++ 项目中,可以通过将 GoogleTest 作为子模块添加到项目中并适当设置 CMakeLists.txt 文件来完成。以下是步骤的详细说明和相关文件的配置。

1. 准备项目结构

假设项目结构如下:

MyProject/
|-- CMakeLists.txt
|-- src/
|   |-- CMakeLists.txt
|   |-- example.cpp
|   |-- example.h
|-- tests/
    |-- CMakeLists.txt
    |-- test_example.cpp
|-- extern/
    |-- googletest/

2. 添加 GoogleTest 作为工程子模块

在项目根目录下运行以下命令以添加 GoogleTest 为子模块:
查看自己环境cmake版本:

cmake --version

① 以我的环境cmake为3.10.0版本为例,对应下载googletest的v1.13.0版本,网址:https://github.com/google/googletest/releases/tag/v1.13.0,可以自行下载解压到MyProject/extern/文件夹下。

② 如果环境的cmake为大于等于3.14.0版本,则可以直接执行下面命令,下载最新版googletest:

cd MyProject/extern
git clone git@github.com:google/googletest.git

3. 编辑 CMakeLists.txt 文件

根目录 CMakeLists.txt

在项目的根目录 CMakeLists.txt 文件中,你需要添加对子目录的引用和基本的项目设置。

cmake_minimum_required(VERSION 3.10)
project(MyProject)

# Enable C++11
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

# Add subdirectories
add_subdirectory(src)
add_subdirectory(tests)
add_subdirectory(extern/googletest)
src 目录下的 CMakeLists.txt

在 src 目录的 CMakeLists.txt 文件中,添加构建应用程序所需的源文件。

add_library(core example.cpp)

target_include_directories(core PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
tests 目录下的 CMakeLists.txt

在 tests 目录的 CMakeLists.txt 文件中,设置测试的构建和链接:

# 指定测试可执行文件
add_executable(runTests test_example.cpp)

# 链接 Google Test 的库和应用库
target_link_libraries(runTests gtest gtest_main core)

# 启用测试
enable_testing()

# 添加测试
add_test(NAME example_tests COMMAND runTests)

4. 源代码和测试代码

确保你有正确的头文件和源代码实现。

example.h
#ifndef EXAMPLE_H
#define EXAMPLE_H

int add(int a, int b);
int subtract(int a, int b);

#endif // EXAMPLE_H
example.cpp
#include "example.h"

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

int subtract(int a, int b) 
{
    return a - b;
}
test_example.cpp
#include "gtest/gtest.h"
#include "../src/example.h"

TEST(ExampleTest, AddsTwoNumbers) 
{
    EXPECT_EQ(add(1, 2), 3);
}

TEST(ExampleTest, SubtractsTwoNumbers) 
{
    EXPECT_EQ(subtract(2, 1), 1);
}

// 由于上文tests目录下CMakeLists.txt文件中链接了gtest_main库( target_link_libraries(runTests gtest gtest_main core) ),所以此处main()函数不用自己定义
// 如果tests目录下CMakeLists.txt文件中没有链接gtest_main库,此处需要自己定义main()函数,如下面注释
// 链接gtest_main库和自己定义main()函数两者只能存在一个,并且至少存在一个
/*
int main(int argc, char** argv) 
{
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}
*/

5. 编译和运行测试

在项目的根目录下创建一个构建目录,配置项目,构建项目并运行测试:

mkdir build
cd build
cmake ..
make -j20
./tests/runTests

6. 执行结果输出

[==========] Running 2 tests from 1 test suite.
[----------] Global test environment set-up.
[----------] 2 tests from ExampleTest
[ RUN      ] ExampleTest.AddsTwoNumbers
[       OK ] ExampleTest.AddsTwoNumbers (0 ms)
[ RUN      ] ExampleTest.SubtractsTwoNumbers
[       OK ] ExampleTest.SubtractsTwoNumbers (0 ms)
[----------] 2 tests from ExampleTest (0 ms total)

[----------] Global test environment tear-down
[==========] 2 tests from 1 test suite ran. (1 ms total)
[  PASSED  ] 2 tests.

这是上述示例输出,显示了 Google Test 框架如何运行并报告测试结果。这段输出说明了两个单元测试都通过了,并且没有发生任何错误。接下来,将解释输出中各部分的意义以及如何阅读这些结果。

7. 结果输出分析

  1. 测试总览:

    [==========] Running 2 tests from 1 test suite.
    

    这一行表示正在运行一个包含两个测试的测试套件。

  2. 全局测试环境设置:

    [----------] Global test environment set-up.
    

    这表明全局测试环境正在被设置。这通常包括为所有测试准备必需的资源或配置。

  3. 测试套件信息:

    [----------] 2 tests from ExampleTest
    

    这表示有一个名为 “ExampleTest” 的测试套件包含两个测试。

  4. 单个测试运行:

    [ RUN      ] ExampleTest.AddsTwoNumbers
    [       OK ] ExampleTest.AddsTwoNumbers (0 ms)
    

    这两行表明 “AddsTwoNumbers” 测试正在运行,并且已成功完成,执行时间为 0 毫秒。

    [ RUN      ] ExampleTest.SubtractsTwoNumbers
    [       OK ] ExampleTest.SubtractsTwoNumbers (0 ms)
    

    这两行表示 “SubtractsTwoNumbers” 测试也正在运行并且已成功通过,同样耗时 0 毫秒。

  5. 测试套件总结:

    [----------] 2 tests from ExampleTest (0 ms total)
    

    这表示 “ExampleTest” 测试套件中的两个测试已全部完成,总计耗时 0 毫秒。

  6. 全局测试环境清理:

    [----------] Global test environment tear-down
    

    这表明全局测试环境正在被清理。这通常包括释放全局资源或执行其他清理任务。

  7. 最终结果总结:

    [==========] 2 tests from 1 test suite ran. (1 ms total)
    [  PASSED  ] 2 tests.
    

    这两行提供了最终的测试结果总结。表明已运行一个测试套件中的两个测试,总耗时 1 毫秒,并且所有测试都已通过。

总结

通过以上步骤,可以将 Google Test 集成到任何使用 CMake 管理的 C++ 项目中,这样可以方便地编写和运行单元测试。确保项目的文件路径和模块设置正确,以避免在构建和运行测试时出现问题。

  • 33
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Warren++

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值