Подтвердить что ты не робот

Unit Test Контекст вывода и структуры проекта --- CMake + Google Test Framework

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

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

В двух словах корневой файл cmake добавляет src и тесты в качестве подкаталогов. Файл src cmake объединяет файлы cpp в библиотеку. В тестовом файле cmake добавляются mocks и gtest в качестве подкаталогов. Макет cmake файла объединяет все его файлы cpp во вторую библиотеку. Наконец, файл cmake в папке тестов связывает библиотеку src, библиотеки google и библиотеки mocks с исполняемыми файлами unit test.

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

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

  • Для того, чтобы построить все это и по-прежнему держать мой каталог проекта довольно чистый я компакт-диск в папку сборки и запуска "CMake.." Это похоже на работу очень хорошо, и я планировал по настройке Vim всегда запускать оформляют этой папки. У кого-нибудь есть какие-либо советы или какие-либо проблемы с этим подходом?

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

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

Спасибо очень заблаговременно.

4b9b3361

Ответ 1

  • Это рекомендуемая практика cmake, называемая сборка вне источника
  • AFAIK не рекомендуется устанавливать перекомпилированные библиотеки googletest в систему. Поэтому не должно быть никаких проблем, если вы скомпилируете его как общую или статическую библиотеку как часть вашей сборки проекта. Я использовал googletest 1.6.0 таким образом без проблем на Windows, Linux, OSX и Android.
  • Я не уверен в 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)

Ответ 2

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