Добавление Googletest в существующий проект CMake - PullRequest
0 голосов
/ 12 февраля 2019

У меня проблемы с интеграцией 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)

существующие_источники / 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)

существующие_источники / существующие.h

#ifndef TESTTESTER_EXISTING_H
#define TESTTESTER_EXISTING_H

int sample() {
    return 1;
}

#endif //TESTTESTER_EXISTING_H

существующие_источники / 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 будет основным исполняемым файлом проекта, который будет запускать код из существующие_курсы / main.cpp и выходные данные sample() output = 1.

Test_TestTester должны быть модульными тестами из main_test.cpp, который проверяет, что 1 == 1 и 1 == sample().Это должно выполняться при сборке проекта.

Попытки:

Я пытался использовать CMake add_subdirectory () , чтобы выставить второй CMakeLists.txt в подкаталоге test, который имеет собственный add_executable () с именем тестовой программы, однако я не могу найти какой-либо вывод, связанный с тестовой программой.Использование enable_testing () , за которым следует add_test () также не может привести к каким-либо изменениям.

Обновление:

IЯ понял, что некоторые проблемы и предположения были неверными.

  • В CLion по умолчанию строится конкретная цель.Build all (cmake --build ... --target all) должен быть вызван для сборки других исполняемых файлов.
  • Другие вопросы, которые я читал по этому поводу, похоже, не используют предварительно скомпилированную библиотеку.Я скомпилировал и установил googletest на своем компьютере до его включения в проект.
  • Это может не быть проблемой, но похоже, что большинство людей предпочитают структурировать свои проекты с каждым каталогом, имеющим собственный файл CMakeLists.txt,Я реорганизовал мой, чтобы соответствовать, чтобы облегчить следование советам других.

Я обновил файлы CMakeLists своими изменениями.Использование --target all создает все соответствующим образом, но я все еще не могу запустить тесты при сборке проекта.

1 Ответ

0 голосов
/ 12 февраля 2019

Существует очень мало проблем с размещенным вами образцом проекта.

Кажется, вы ошибочно предположили, что:

add_test(NAME Test COMMAND Test_TestTester)

в вашем new_test_source/CMakeLists.txt - это все, что нужно дляполучить Test_TestTester, выполненный make.

Фактически, как объявлено в первой строке add_test документации :

Добавитьтест для проекта, запускаемого ctest (1).

ваша add_test команда достаточна только для запуска Test_TestTester, когда после make вы запускаете ctest в каталоге сборки подпроекта Test_TestTester.

Более того, даже это произойдет, только если вы включите ctest тестирование для этого подпроекта, вызвав enable_testing() в new_test_source/CMakeLists.txtчто вы не делаете.Вы говорите, что сделали это позже:

Использование enable_testing () с последующим add_test () также не может привести к каким-либо изменениям.

Но это потому, что вы до сих пор этого не сделалиничего не делал, кроме создания тестов , которые вы можете запускать с 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 будет:

$ 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
...