【发布时间】:2019-02-12 16:59:51
【问题描述】:
我无法将 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(抱歉,名字有点奇怪,看来我可以选择一个更好的项目名字!)。
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 中,它默认构建特定目标。必须调用 Build all (
cmake --build ... --target all) 来构建其他可执行文件。 - 我阅读的与此相关的其他问题似乎没有使用预编译库。在将 googletest 纳入项目之前,我在我的机器上编译并安装了它。
- 这可能不是问题,但看起来大多数人选择使用每个目录都有自己的 CMakeLists.txt 文件来构建他们的项目。我重新组织了我的匹配,以便更容易遵循他人的建议。
我用我的更改更新了 CMakeLists 文件。使用--target all 可以正确构建所有内容,但是在构建项目时我仍然无法运行测试。
【问题讨论】:
-
get the tests to run什么意思?如何?有错误信息吗?你试过什么?你如何运行它们?测试可执行文件是否正确构建?如果您自己运行测试可执行文件怎么办?为什么要在 .h 文件中提供具有外部链接的符号的定义?sample函数不应该至少有static或static inline吗? -
测试通过执行 Test_TestTester 可执行文件运行。抱歉,如果我不清楚,我的意思是此时的挂断是将测试的执行集成到构建过程中。 add_test() 的 COMMAND 部分是告诉 CMake 执行什么命令来运行测试,对吗?静态或内联说明符可能更正确,但这只是一个有效的最小示例。
标签: cmake c++14 googletest