将 Googletest 添加到现有的 CMake 项目
Adding Googletest To Existing CMake Project
我无法将 googletest 集成到现有项目中。我整理了一个简单的项目来表示我的项目结构:
项目结构
CMakeLists.txt:
cmake_minimum_required(VERSION 3.13)
project(TestTester)
set(CMAKE_CXX_STANDARD 14)
include_directories(existing_source)
add_subdirectory(existing_source)
add_subdirectory(new_test_source)
existing_source/CMakeLists.txt:
cmake_minimum_required(VERSION 3.13)
project(Test_TestTester)
set(CMAKE_CXX_STANDARD 14)
add_executable(TestTester main.cpp existing.h)
new_test_source/CMakeLists.txt:
cmake_minimum_required(VERSION 3.13)
project(Test_TestTester)
set(CMAKE_CXX_STANDARD 14)
find_package(PkgConfig REQUIRED)
pkg_check_modules(gtest REQUIRED gtest>=1.8.1)
SET(CMAKE_CXX_FLAGS -pthread)
enable_testing()
include_directories(${gtest_INCLUDE_DIRS})
add_executable(Test_TestTester main_test.cpp ../existing_source/existing.h)
target_link_libraries(Test_TestTester ${gtest_LIBRARIES})
add_test(NAME Test COMMAND Test_TestTester)
existing_source/existing.h
#ifndef TESTTESTER_EXISTING_H
#define TESTTESTER_EXISTING_H
int sample() {
return 1;
}
#endif //TESTTESTER_EXISTING_H
existing_source/main.cpp
#include <iostream>
#include "existing.h"
int main() {
std::cout << "sample() output = " << sample() << std::endl;
return 0;
}
new_test_source/main_test.cpp
#include <gtest/gtest.h>
#include "../existing_source/existing.h"
TEST(SampleTestCase, TestOneIsOne) {
EXPECT_EQ(1, 1);
}
TEST(ExistingCodeTestCase, TestSample) {
EXPECT_EQ(1, sample());
}
GTEST_API_ int main(int argc, char **argv) {
printf("Running main() from %s\n", __FILE__);
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
目标:
使用 CMake 构建将创建两个可执行文件,一个是 TestTester,另一个是 Test_TestTester(抱歉奇怪name,看来我可以选择一个更好的项目名称!)。
TestTester 将是主要的项目可执行文件,它将 运行 来自 existing_course/main.cpp 的代码和输出 sample() output = 1
.
Test_TestTester 应该是来自 main_test.cpp 的单元测试,它测试 1 == 1
和 1 == sample()
。建工程的时候应该运行
尝试次数:
我尝试使用 CMake 的 add_subdirectory() 在测试子目录中公开第二个 CMakeLists.txt,它有自己的 add_executable() 与测试程序的名称,但是我找不到与测试程序相关的任何输出。使用 enable_testing() 后跟 add_test() 也无法产生任何变化。
更新:
我意识到有些问题和假设是错误的。
- 在 CLion 中,它默认构建特定目标。必须调用全部构建 (
cmake --build ... --target all
) 来构建其他可执行文件。
- 我看的其他与此相关的问题好像都没有使用预编译库。在将 googletest 包含到项目中之前,我在我的机器上编译并安装了它。
- 这可能不是问题,但看起来大多数人都选择使用每个目录都有自己的 CMakeLists.txt 文件来构建他们的项目。我重新组织了我的匹配,以便更容易遵循他人的建议。
我用我的更改更新了 CMakeLists 文件。使用 --target all
可以适当地构建所有内容,但是在构建项目时我仍然无法将测试设置为 运行。
您 post 编辑的示例项目几乎没有错误。
您似乎错误地认为:
add_test(NAME Test COMMAND Test_TestTester)
在你的 new_test_source/CMakeLists.txt
中就可以得到你的 Test_TestTester
由 make
.
执行
其实正如the add_test
documentation第一行声明的那样:
Add a test to the project to be run by ctest(1).
您的 add_test
命令仅足以获取 Test_TestTester
运行 时,
在 make
之后,你 运行 ctest
在 Test_TestTester
子项目的构建目录中。
此外,只有在您为该子项目启用 ctest
测试时才会发生这种情况
通过在 new_test_source/CMakeLists.txt
中调用 enable_testing()
,而您不会这样做。你说你做了
后来:
Using enable_testing() followed by add_test() is also failing to produce any changes.
但那是因为您除了创建测试 之外还没有做任何事情,您可以 运行 使用 ctest
,
仍然没有 运行 ctest
.
所以假设我在我的工作目录(我有)中有你的样本项目,并且
我刚刚通过更改 new_test_source/CMakeLists.txt
来更改:
project(Test_TestTester)
至:
project(Test_TestTester)
enable_testing()
然后:
$ mkdir build
$ cd build
$ cmake ..
生成构建系统,并且:
$ make
Scanning dependencies of target TestTester
[ 25%] Building CXX object existing_source/CMakeFiles/TestTester.dir/main.cpp.o
[ 50%] Linking CXX executable TestTester
[ 50%] Built target TestTester
Scanning dependencies of target Test_TestTester
[ 75%] Building CXX object new_test_source/CMakeFiles/Test_TestTester.dir/main_test.cpp.o
[100%] Linking CXX executable Test_TestTester
[100%] Built target Test_TestTester
构建一切,并且:
# We're still in `./build`
$ cd new_test_source/
$ ctest
Test project /home/imk/develop/so/scrap2/build/new_test_source
Start 1: Test
1/1 Test #1: Test ............................. Passed 0.00 sec
100% tests passed, 0 tests failed out of 1
Total Test time (real) = 0.00 sec
运行s 你的测试。完整的测试日志保存在:
$ cat ./Testing/Temporary/LastTest.log
Start testing: Feb 12 19:23 GMT
----------------------------------------------------------
1/1 Testing: Test
1/1 Test: Test
Command: "/home/imk/develop/so/scrap2/build/new_test_source/Test_TestTester"
Directory: /home/imk/develop/so/scrap2/build/new_test_source
"Test" start time: Feb 12 19:23 GMT
Output:
----------------------------------------------------------
Running main() from /home/imk/develop/so/scrap2/new_test_source/main_test.cpp
[==========] Running 2 tests from 2 test suites.
[----------] Global test environment set-up.
[----------] 1 test from SampleTestCase
[ RUN ] SampleTestCase.TestOneIsOne
[ OK ] SampleTestCase.TestOneIsOne (0 ms)
[----------] 1 test from SampleTestCase (0 ms total)
[----------] 1 test from ExistingCodeTestCase
[ RUN ] ExistingCodeTestCase.TestSample
[ OK ] ExistingCodeTestCase.TestSample (0 ms)
[----------] 1 test from ExistingCodeTestCase (0 ms total)
[----------] Global test environment tear-down
[==========] 2 tests from 2 test suites ran. (0 ms total)
[ PASSED ] 2 tests.
<end of output>
Test time = 0.00 sec
----------------------------------------------------------
Test Passed.
"Test" end time: Feb 12 19:23 GMT
"Test" time elapsed: 00:00:00
----------------------------------------------------------
End testing: Feb 12 19:23 GMT
如果您想在 运行 ctest
时在您的主机上看到所有这些内容,您可以 运行
它处于详细模式 ctest -V
。或者,如果您只想查看详细信息,如果
测试失败,ctest --output-on-failure
.
一切正常,也许您对此感到满意,知道如何
有用。如果您仍然希望您的测试由make
自动运行 - 这
不是传统的 - 然后你需要添加一个自定义 post-build 命令到
Test_TestTester
自动定位到 运行 ctest
。只需附加,例如
add_custom_command(TARGET Test_TestTester
COMMENT "Run tests"
POST_BUILD COMMAND ctest ARGS --output-on-failure
)
到new_test_source/CMakeLists.txt
。那么一个干净的make
的输出是:
$ make
Scanning dependencies of target TestTester
[ 25%] Building CXX object existing_source/CMakeFiles/TestTester.dir/main.cpp.o
[ 50%] Linking CXX executable TestTester
[ 50%] Built target TestTester
Scanning dependencies of target Test_TestTester
[ 75%] Building CXX object new_test_source/CMakeFiles/Test_TestTester.dir/main_test.cpp.o
[100%] Linking CXX executable Test_TestTester
Run tests
Test project /home/imk/develop/so/scrap2/build/new_test_source
Start 1: Test
1/1 Test #1: Test ............................. Passed 0.00 sec
100% tests passed, 0 tests failed out of 1
Total Test time (real) = 0.00 sec
[100%] Built target Test_TestTester
我无法将 googletest 集成到现有项目中。我整理了一个简单的项目来表示我的项目结构:
项目结构
CMakeLists.txt:
cmake_minimum_required(VERSION 3.13)
project(TestTester)
set(CMAKE_CXX_STANDARD 14)
include_directories(existing_source)
add_subdirectory(existing_source)
add_subdirectory(new_test_source)
existing_source/CMakeLists.txt:
cmake_minimum_required(VERSION 3.13)
project(Test_TestTester)
set(CMAKE_CXX_STANDARD 14)
add_executable(TestTester main.cpp existing.h)
new_test_source/CMakeLists.txt:
cmake_minimum_required(VERSION 3.13)
project(Test_TestTester)
set(CMAKE_CXX_STANDARD 14)
find_package(PkgConfig REQUIRED)
pkg_check_modules(gtest REQUIRED gtest>=1.8.1)
SET(CMAKE_CXX_FLAGS -pthread)
enable_testing()
include_directories(${gtest_INCLUDE_DIRS})
add_executable(Test_TestTester main_test.cpp ../existing_source/existing.h)
target_link_libraries(Test_TestTester ${gtest_LIBRARIES})
add_test(NAME Test COMMAND Test_TestTester)
existing_source/existing.h
#ifndef TESTTESTER_EXISTING_H
#define TESTTESTER_EXISTING_H
int sample() {
return 1;
}
#endif //TESTTESTER_EXISTING_H
existing_source/main.cpp
#include <iostream>
#include "existing.h"
int main() {
std::cout << "sample() output = " << sample() << std::endl;
return 0;
}
new_test_source/main_test.cpp
#include <gtest/gtest.h>
#include "../existing_source/existing.h"
TEST(SampleTestCase, TestOneIsOne) {
EXPECT_EQ(1, 1);
}
TEST(ExistingCodeTestCase, TestSample) {
EXPECT_EQ(1, sample());
}
GTEST_API_ int main(int argc, char **argv) {
printf("Running main() from %s\n", __FILE__);
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
目标:
使用 CMake 构建将创建两个可执行文件,一个是 TestTester,另一个是 Test_TestTester(抱歉奇怪name,看来我可以选择一个更好的项目名称!)。
TestTester 将是主要的项目可执行文件,它将 运行 来自 existing_course/main.cpp 的代码和输出 sample() output = 1
.
Test_TestTester 应该是来自 main_test.cpp 的单元测试,它测试 1 == 1
和 1 == sample()
。建工程的时候应该运行
尝试次数:
我尝试使用 CMake 的 add_subdirectory() 在测试子目录中公开第二个 CMakeLists.txt,它有自己的 add_executable() 与测试程序的名称,但是我找不到与测试程序相关的任何输出。使用 enable_testing() 后跟 add_test() 也无法产生任何变化。
更新:
我意识到有些问题和假设是错误的。
- 在 CLion 中,它默认构建特定目标。必须调用全部构建 (
cmake --build ... --target all
) 来构建其他可执行文件。 - 我看的其他与此相关的问题好像都没有使用预编译库。在将 googletest 包含到项目中之前,我在我的机器上编译并安装了它。
- 这可能不是问题,但看起来大多数人都选择使用每个目录都有自己的 CMakeLists.txt 文件来构建他们的项目。我重新组织了我的匹配,以便更容易遵循他人的建议。
我用我的更改更新了 CMakeLists 文件。使用 --target all
可以适当地构建所有内容,但是在构建项目时我仍然无法将测试设置为 运行。
您 post 编辑的示例项目几乎没有错误。
您似乎错误地认为:
add_test(NAME Test COMMAND Test_TestTester)
在你的 new_test_source/CMakeLists.txt
中就可以得到你的 Test_TestTester
由 make
.
其实正如the add_test
documentation第一行声明的那样:
Add a test to the project to be run by ctest(1).
您的 add_test
命令仅足以获取 Test_TestTester
运行 时,
在 make
之后,你 运行 ctest
在 Test_TestTester
子项目的构建目录中。
此外,只有在您为该子项目启用 ctest
测试时才会发生这种情况
通过在 new_test_source/CMakeLists.txt
中调用 enable_testing()
,而您不会这样做。你说你做了
后来:
Using enable_testing() followed by add_test() is also failing to produce any changes.
但那是因为您除了创建测试 之外还没有做任何事情,您可以 运行 使用 ctest
,
仍然没有 运行 ctest
.
所以假设我在我的工作目录(我有)中有你的样本项目,并且
我刚刚通过更改 new_test_source/CMakeLists.txt
来更改:
project(Test_TestTester)
至:
project(Test_TestTester)
enable_testing()
然后:
$ mkdir build
$ cd build
$ cmake ..
生成构建系统,并且:
$ make
Scanning dependencies of target TestTester
[ 25%] Building CXX object existing_source/CMakeFiles/TestTester.dir/main.cpp.o
[ 50%] Linking CXX executable TestTester
[ 50%] Built target TestTester
Scanning dependencies of target Test_TestTester
[ 75%] Building CXX object new_test_source/CMakeFiles/Test_TestTester.dir/main_test.cpp.o
[100%] Linking CXX executable Test_TestTester
[100%] Built target Test_TestTester
构建一切,并且:
# We're still in `./build`
$ cd new_test_source/
$ ctest
Test project /home/imk/develop/so/scrap2/build/new_test_source
Start 1: Test
1/1 Test #1: Test ............................. Passed 0.00 sec
100% tests passed, 0 tests failed out of 1
Total Test time (real) = 0.00 sec
运行s 你的测试。完整的测试日志保存在:
$ cat ./Testing/Temporary/LastTest.log
Start testing: Feb 12 19:23 GMT
----------------------------------------------------------
1/1 Testing: Test
1/1 Test: Test
Command: "/home/imk/develop/so/scrap2/build/new_test_source/Test_TestTester"
Directory: /home/imk/develop/so/scrap2/build/new_test_source
"Test" start time: Feb 12 19:23 GMT
Output:
----------------------------------------------------------
Running main() from /home/imk/develop/so/scrap2/new_test_source/main_test.cpp
[==========] Running 2 tests from 2 test suites.
[----------] Global test environment set-up.
[----------] 1 test from SampleTestCase
[ RUN ] SampleTestCase.TestOneIsOne
[ OK ] SampleTestCase.TestOneIsOne (0 ms)
[----------] 1 test from SampleTestCase (0 ms total)
[----------] 1 test from ExistingCodeTestCase
[ RUN ] ExistingCodeTestCase.TestSample
[ OK ] ExistingCodeTestCase.TestSample (0 ms)
[----------] 1 test from ExistingCodeTestCase (0 ms total)
[----------] Global test environment tear-down
[==========] 2 tests from 2 test suites ran. (0 ms total)
[ PASSED ] 2 tests.
<end of output>
Test time = 0.00 sec
----------------------------------------------------------
Test Passed.
"Test" end time: Feb 12 19:23 GMT
"Test" time elapsed: 00:00:00
----------------------------------------------------------
End testing: Feb 12 19:23 GMT
如果您想在 运行 ctest
时在您的主机上看到所有这些内容,您可以 运行
它处于详细模式 ctest -V
。或者,如果您只想查看详细信息,如果
测试失败,ctest --output-on-failure
.
一切正常,也许您对此感到满意,知道如何
有用。如果您仍然希望您的测试由make
自动运行 - 这
不是传统的 - 然后你需要添加一个自定义 post-build 命令到
Test_TestTester
自动定位到 运行 ctest
。只需附加,例如
add_custom_command(TARGET Test_TestTester
COMMENT "Run tests"
POST_BUILD COMMAND ctest ARGS --output-on-failure
)
到new_test_source/CMakeLists.txt
。那么一个干净的make
的输出是:
$ make
Scanning dependencies of target TestTester
[ 25%] Building CXX object existing_source/CMakeFiles/TestTester.dir/main.cpp.o
[ 50%] Linking CXX executable TestTester
[ 50%] Built target TestTester
Scanning dependencies of target Test_TestTester
[ 75%] Building CXX object new_test_source/CMakeFiles/Test_TestTester.dir/main_test.cpp.o
[100%] Linking CXX executable Test_TestTester
Run tests
Test project /home/imk/develop/so/scrap2/build/new_test_source
Start 1: Test
1/1 Test #1: Test ............................. Passed 0.00 sec
100% tests passed, 0 tests failed out of 1
Total Test time (real) = 0.00 sec
[100%] Built target Test_TestTester