Результаты модульного теста и структура проекта - PullRequest
19 голосов
/ 31 августа 2011

Я новичок в CMake и использую Google Test Framework. Я искал более сложные примеры объединения CMake и среды тестирования Google, но мне не повезло. Я надеялся, что кто-то может высказать свое мнение о настройке, к которой я пришел, и ответить на вопрос для меня. Вот основная структура проекта:

ProjectFolder
-CMakeLists.txt
/ построить
/ включить
-все мои файлы .h
/ SRC
-CMakeLists.txt
-все мои файлы .cpp
/ тесты
-CMakeLists.txt
/ gtest
-Google's CMakeLists.txt
/ издевается
-CMakeLists.txt
-cpp и h файлы для макетов

Короче говоря, корневой файл cmake добавляет src и тестирует в качестве подкаталогов. Файл src cmake переносит файлы cpp в библиотеку. Файл cmake tests добавляет макеты и gtest в качестве подкаталогов. Поддельный файл cmake переносит все свои файлы cpp во вторую библиотеку. Наконец, файл cmake в папке «tests» связывает библиотеку src, библиотеки google и mocks с исполняемыми файлами модульного теста.

В итоге я получаю несколько исполняемых файлов: objA_unittest, objB_unittest и т. Д.

Несколько вещей:

  1. Чтобы собрать все это и сохранить каталог проекта достаточно чистым, я перехожу в папку сборки и запускаю "cmake ..". Это, кажется, работает очень хорошо, и я планировал настроить vim, чтобы всегда запускать make этой папки. У кого-нибудь есть какие-либо советы или или есть какие-либо проблемы с этим подходом?

  2. Мне не нравится идея вкладывать библиотеку Google в папку моего проекта (особенно, если у меня в конечном итоге есть несколько проектов, которые ее используют), но, как представляется, настоятельно рекомендуется не выполнять прекомпиляцию библиотеки Google я не вижу никакого способа обойти это. Однако, если кто-нибудь знает, как лучше, я бы с удовольствием его услышал.

  3. Запуск тестов. Мне нравится, что все, что мне нужно сделать, это запустить "make test", чтобы выполнить все мои модульные тесты с помощью ctest. Тем не менее, я обнаружил, что мне не очень нравится результат. Каждый исполняемый модуль содержит несколько различных модульных тестов. Запуск их напрямую обеспечивает очень подробный отзыв Google. Если один из тестов в исполняемом файле не пройден, я точно знаю, какой тест не пройден и почему. Ранее я использовал make-файл и в конце make-файла я просто выполнил все тесты. Сначала я попытался исправить это, создав собственную цель сборки в cmake. Однако он выполняет только первую команду. Мне либо нужен способ получить более подробный вывод из CTest, либо мне нужен способ автоматически выводить bash-скрипт или что-то похожее из CMake для выполнения каждого исполняемого модуля. Другими словами, у меня сейчас настроен файл cmake, поэтому мне нужно только добавить модульный тест в одном месте для генерации исполняемого файла, и я не хочу не забыть добавить его во второе место, если я могу избежать Это. У кого-нибудь есть опыт, который будет полезен в этом вопросе?

Заранее большое спасибо.

Ответы [ 2 ]

12 голосов
/ 01 сентября 2011

Вот мой пример . Я сделал это как краткое руководство для моей команды разработчиков. Возможно, вы тоже найдете это полезным.

11 голосов
/ 01 сентября 2011
  1. На самом деле это рекомендуемая практика cmake, которая называется сборка вне источника
  2. AFAIK Не рекомендуется устанавливать в систему перекомпилированные библиотеки googletest. Таким образом, не должно быть никаких проблем, если вы компилируете его как разделяемую или статическую библиотеку как часть вашей сборки проекта. Таким образом я без проблем использовал googletest 1.6.0 на Windows, Linux, OSX и Android.
  3. Я не уверен насчет CTest, но пользовательская цель определенно способна выполнить все тесты для вас. Вот краткое решение, которое я могу предложить:

Добавьте следующие строки в ваш верхний уровень CMakeLists.txt (до добавления каких-либо тестов):

add_custom_target(test)
macro(run_test test_target)
  add_custom_target(${test_target}_runtest
      COMMAND ${test_target} #cmake 2.6 required
      DEPENDS ${test_target}
      WORKING_DIRECTORY "${CMAKE_BINARY_DIR}")
  add_dependencies(test ${test_target}_runtest)
endmacro()

Далее для каждого теста добавьте одну строку, чтобы добавить тест к цели test:

#add_executable(mytest ${mysources})
run_test(mytest)
...