Выходные данные модульных тестов и рекомендации по структуре проекта CMake + Google Test Framework

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

ProjectFolder
-CMakeLists.txt
/ build
/ include
-все мои файлы .h
/ src
-CMakeLists.txt
- все мои файлы .cpp
/ tests
-CMakeLists.txt
/ gtest
-Google CMakeLists.txt
/ mocks
-CMakeLists.txt
-cpp и h файлы для моков

Короче говоря, корневой файл cmake добавляет src и тесты в качестве подкаталогов. Файл src cmake объединяет файлы cpp в библиотеку. Файл cmake tests добавляет mocks и 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, поэтому мне нужно только добавить модульный тест в одном месте для создания исполняемого файла, и я не хочу, чтобы не забывал добавлять его во второе место, если я могу избежать Это. Есть ли у кого-нибудь опыт, который был бы полезен в этом вопросе?

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


person Landon    schedule 31.08.2011    source источник


Ответы (2)


  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)
person Andrey Kamaev    schedule 01.09.2011
comment
Будьте осторожны: уже существует предопределенная цель CMake с именем test. Как правило, не рекомендуется добавлять настраиваемую цель с таким же именем. Вы также можете вызвать ctest -V или ctest -VV в том же каталоге, где вы вызываете make test сейчас, и он запустит полный набор тестов и покажет вам результат всех тестов. (-V == подробный, -VV == очень подробный) - person DLRdave; 01.09.2011
comment
К вашему сведению, я очень ценю быстрый ответ (и тот, что ниже). Я только что был занят в школе, и у меня не было времени протестировать ни то, ни другое. Как только я это сделаю, я выберу подходящий ответ. Просто хотел сообщить, что не забыл. :) - person Landon; 02.09.2011

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

person Sergei Nikulov    schedule 01.09.2011
comment
Мне нравится, что этот пример простой. Однако в настоящее время команда gtest рекомендует включить в пакет исходный код gtest. Какие-нибудь примеры того, как это сделать? - person Kurt Schwehr; 18.11.2012
comment
да. Я знаю об этом изменении. Проверим и скоро и обновлю соответственно. - person Sergei Nikulov; 19.11.2012
comment
@KurtSchwehr Я начал внедрять новый способ и в конечном итоге нашел здесь решение stackoverflow.com/questions/9689183/cmake-googletest. Будет обновляться, как указано в ответе выше. - person Sergei Nikulov; 03.12.2012