对于使用 CMake 将 GoogleTest 集成到 C++ 项目中,可以通过将 GoogleTest 作为子模块添加到项目中并适当设置 CMakeLists.txt 文件来完成。以下是步骤的详细说明和相关文件的配置。
使用cmake将googletest组织到C++工程中,进行代码单元测试并分析结果
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 [email protected]: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
#ifndefEXAMPLE_H#defineEXAMPLE_Hintadd(int a,int b);intsubtract(int a,int b);#endif// EXAMPLE_H
example.cpp
#include"example.h"intadd(int a,int b){return a + b;}intsubtract(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 1test 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 1test suite ran. (1 ms total)[ PASSED ]2 tests.
这是上述示例输出,显示了 Google Test 框架如何运行并报告测试结果。这段输出说明了两个单元测试都通过了,并且没有发生任何错误。接下来,将解释输出中各部分的意义以及如何阅读这些结果。
7. 结果输出分析
- 测试总览:
[==========] Running 2 tests from 1test suite.
这一行表示正在运行一个包含两个测试的测试套件。 - 全局测试环境设置:
[----------] Global test environment set-up.
这表明全局测试环境正在被设置。这通常包括为所有测试准备必需的资源或配置。 - 测试套件信息:
[----------]2 tests from ExampleTest
这表示有一个名为 “ExampleTest” 的测试套件包含两个测试。 - 单个测试运行:
[ RUN ] ExampleTest.AddsTwoNumbers[ OK ] ExampleTest.AddsTwoNumbers (0 ms)
这两行表明 “AddsTwoNumbers” 测试正在运行,并且已成功完成,执行时间为 0 毫秒。[ RUN ] ExampleTest.SubtractsTwoNumbers[ OK ] ExampleTest.SubtractsTwoNumbers (0 ms)
这两行表示 “SubtractsTwoNumbers” 测试也正在运行并且已成功通过,同样耗时 0 毫秒。 - 测试套件总结:
[----------]2 tests from ExampleTest (0 ms total)
这表示 “ExampleTest” 测试套件中的两个测试已全部完成,总计耗时 0 毫秒。 - 全局测试环境清理:
[----------] Global test environment tear-down
这表明全局测试环境正在被清理。这通常包括释放全局资源或执行其他清理任务。 - 最终结果总结:
[==========]2 tests from 1test suite ran. (1 ms total)[ PASSED ]2 tests.
这两行提供了最终的测试结果总结。表明已运行一个测试套件中的两个测试,总耗时 1 毫秒,并且所有测试都已通过。
总结
通过以上步骤,可以将 Google Test 集成到任何使用 CMake 管理的 C++ 项目中,这样可以方便地编写和运行单元测试。确保项目的文件路径和模块设置正确,以避免在构建和运行测试时出现问题。
版权归原作者 Warren++ 所有, 如有侵权,请联系我们删除。