Тестирование наших модулей CMake
Мы создали несколько дополнительных функций для CMake. Их стало довольно много, и нам нужно (юнит) их протестировать.
Есть простые, которые являются только переменными базами, такими как:
function(join_list LIST GLUE)
Их можно протестировать с помощью специального сценария CMake, который проверяет результаты. Для этого мы также написали набор макросов assert.
Это становится намного сложнее, когда функции нацелены на:
function(target_my_custom_property_set TARGET VALUE)
Нам нужно несколько файлов CMakeLists.txt, которые необходимо настроить. Конфигурация должна быть успешной или неудачной с указанными сообщениями. Также файлы результатов должны быть проверены.
Интересно, есть ли более простой способ? Есть ли существующая структура? Как Kitware проверяет поставленные модули?
2 ответа
ctest
является основой для запуска всевозможных тестов. Есть много тестов для cmake
которые запускаются как часть процесса тестирования CMake. Эти тесты являются частью исходного кода в папке " Тесты " и являются частью CMakeLists.txt
,
Конкретные тесты, которые вы хотите посмотреть, находятся в RunCMake
папка. Эти тесты используют RunCMake.cmake
, Хорошим примером являются тесты в message
, Что эти тесты делают, это используют execute_process
чтобы захватить вывод из cmake
и сравнить вывод из cmake
настройте шаг для содержимого файла с ожидаемым выводом. Возвращаемое значение из cmake
также возвращается и может быть проверен.
Вы не указываете, что такое "файлы результатов". Существуют примеры, которые являются более сложными, чем выполнение конфигурации, сборка и сканирование некоторых файлов для проверки их содержимого.
Это может быть проще, если вы отделите проверку сообщений в неудачной конфигурации от неудачной сборки против проходящей конфигурации и сборки и конкретного выходного сообщения.
Прошло более 4 лет, а я до сих пор борюсь с этим. Однако одно из решений, которое мы используем, — это имитировать целевые функции:
function(set_target_properties)
assert(${CMAKE_ARGC} == 8)
# more asserts....
endfunction()
target_my_custom_property_set(tar val)
Зачастую этого бывает достаточно для проверки этих функций.