1、编译GoogleTest
- 下载googletest:
git clone https://github.com/google/googletest.git
- 编译:
$ cd googletest
$ cmake -DBUILD_SHARED_LIBS=ON .
$ make
2、配置工程
2.1 创建工程
整个工程的目录结构如下:
hello
|--bin
|--build
|--include
|--lib
|--src
| |--***.cpp
| |--***.h
| |--CMakeLists.txt
|--test
| |--test_***.cpp
| |--CMakeLists.txt
|--CMakeLists.txt
- bin:这个目录保存编译得到的二进制文件
- build:这个目录保存编译时的临时文件
- include:这个目录保存第三方库的头文件
- lib:这个目录保存第三方库的链接库文件
- src:这个目录保存源文件和头文件
- test :这个目录保存单元测试文件、集成测试文件、系统测试文件
2.2 配置GoogleTest
- 把googletest的头文件复制到hello/include目录中
cp googletest/googlemock/include/* hello/include
cp googletest/googletest/include/* hello/include
- 把googletest的链接库文件复制到hello/lib文件中
cp googletest/lib/* hello/lib
3、运行hello world
3.1 源码文件
- src/main.cpp
#include <iostream>
#include <string>
#include <sys/time.h>
#include <unistd.h>
#include "sum.h"
using namespace std;
int main()
{
std::cout << sum(2, 3) << std::endl;
return 0;
}
- src/sum.cpp
#include <iostream>
using namespace std;
int sum(int a, int b)
{
return a + b;
}
- src/sum.h
#include <iostream>
using namespace std;
int sum(int a, int b);
- test/test_sum.cpp
#include <iostream>
#include <gtest/gtest.h>
#include "sum.h"
using namespace std;
TEST(sum, testSum)
{
EXPECT_EQ(5, sum(2, 3)); // 求合2+3=5
EXPECT_NE(3, sum(3, 4)); // 求合3+4 != 3
}
/* 如果在此处不写main函数,那么在链接库的时候还需要链接-lgtest_main, 否则只需链接-lgtest即可。*/
int main(int argc, char **argv)
{
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
3.2 CMakeLists.txt文件
- hello/CMakeLists.txt
project(hello)
cmake_minimum_required(VERSION 3.14)
include(CTest)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin)
set(CMAKE_CXX_STANDARD 11) # 指定C++11进行编译
add_subdirectory(src)
enable_testing() #如果要使用ctest,必须在source root directory中调用该函数
add_subdirectory(test)
# TODO 如果有更多的和 src 并列的子目录中,并且其中存在源代码,请把他们也加入进来,否则这些文件不会参与编译
# add_subdirectory( your_new_folder )
- hello/src/CMakeLists.txt
# 指定include的目录
include_directories(${CMAKE_SOURCE_DIR}/include)
# 指定lib的目录
link_directories(${CMAKE_SOURCE_DIR}/lib)
# 单独编译成一个 lib 库
add_library(lib_sum OBJECT sum.cpp)
# mian.c 编译成一个可执行文件,因为里面包含 main 函数
add_executable(hello main.cpp)
# 最后的可执行文件必须和上面的lib进行链接
target_link_libraries(hello lib_sum)
# 如何增加一个新的源文件,参与编译:
# 1: 新建一个文件,比如 newfile.cpp
# 2: 如果这个文件参与库的编译链接,那么将该文件添加到上面的 add_library() 参数列表的最后
# 3: 如果这个文件只参与最后的编译链接,那么将其添加到上面的 add_executable() 参数列表的最后。
# 如果新文件中要参与最后的 googletest的测试,那么必须添加到 add_library 最后。
# TODO 如何增加一个新的可执行文件 ?
# 1: 在 src 目录下新建一个 .cpp/.c 文件,编辑并且保存;比如叫 newfile.cpp
# 2: 增加一行 add_executable(newfile newfile.cpp)
# 3: 重新执行 cmake build 即可。
# !!注意!!
# 1: 头文件要添加到 include 目录下,如果添加到了其它目录下,务必在这里调用 include_directories
# 2: 如果新增的文件既不被add_library,也不add_executable,那么就不会被编译。
- hello/test/CMakeLists.txt
add_executable(test_sum test_sum.cpp)
# 指定include的目录
target_include_directories(test_sum PUBLIC ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/src)
# 指定lib的目录
target_link_directories(test_sum PUBLIC ${CMAKE_SOURCE_DIR}/lib)
target_link_libraries(test_sum lib_sum gtest)
# !!注意!!
# 测试用例的可执行文件的名字必须用 test_ 开始,这样该用例才能够出现在 googleTest 用例树中
# 这个可执行文件并且必须位于 ${workspaceFolder}/bin 目录中,CMake的默认就是输出到这个目录中。
# test_sum 是包含googletest用例的可执行文件,add_test 之后可以被CMake来执行
add_test(NAME test COMMAND test_sum)
# TODO : 如果有更多的其它可执行文件,可以编译仿照上面的过程编译链接之后通过 add_test 加入到CMake的测试列表中来。
# add_test(NAME test_yourName COMMAND test_yourExeProgram)
3.3 编译和运行
# 编译
cd build
cmake ..
make
# 运行
cd ../bin
./hello
./test_sum