将Googletest添加到现有CMake项目

时间:2019-02-12 16:59:52

标签: cmake c++14 googletest

我无法将googletest集成到我现有的项目中。我整理了一个简单的项目来代表我的项目结构:

项目结构

Project Structure Image (Can't post directly without 10 rep)

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 == 11 == sample()。这应该在项目构建时运行。

尝试:

我尝试使用CMake的 add_subdirectory()在测试子目录中公开第二个CMakeLists.txt,该子目录具有自己的带有测试名称的 add_executable()程序,但是找不到与测试程序相关的任何输出。同时使用 enable_testing() add_test()也不会产生任何更改。

更新

我意识到一些问题和假设是错误的。

  • 在CLion内,它默认创建一个特定目标。必须调用生成所有(cmake --build ... --target all)来生成其他可执行文件。
  • 我读到的与此相关的其他问题似乎没有使用预编译的库。在将Googletest纳入项目之前,我已在其机器上编译并安装了googletest。
  • 这可能不是问题,但似乎大多数人选择使用每个目录都有其自己的CMakeLists.txt文件来构造其项目。我重新组织了我的比赛,以使其更容易遵循他人的建议。

我使用所做的更改更新了CMakeLists文件。使用--target all可以适当地构建所有内容,但是在构建项目时我仍然无法运行测试。

1 个答案:

答案 0 :(得分:1)

您发布的标本项目几乎没有错。

似乎您误认为:

add_test(NAME Test COMMAND Test_TestTester)
您的new_test_source/CMakeLists.txt中的

Test_TestTester执行。

实际上,如the add_test documentation第一行所声明:

  

将测试添加到要由ctest(1)运行的项目。

您的make命令仅在运行add_test时就足够了, 在Test_TestTester之后,您可以在make子项目的构建目录中运行ctest

此外,仅当您为该子项目启用Test_TestTester测试时,才会发生这种情况 通过调用ctest中的enable_testing(),您不需要这样做。你说你做了 后来:

  

使用enable_testing()后跟add_test()也无法产生任何更改。

但是那是因为您除了创建可以运行的测试 {em> new_test_source/CMakeLists.txt之外,还没有做任何事情, 并且仍然没有运行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

如果您想在运行$ 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的目标是自动运行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