CMake: установка переменной окружения для ctest (или иным образом получение результатов неудачного теста из ctest/make test автоматически)

Я хочу, чтобы ctest показывал результаты неудачных тестов по умолчанию. То есть я хочу запустить:

$ make all test

и увидеть любой результат неудачных тестов без необходимости cat Testing/Temporary/LastTest.log,

Похоже, что есть два способа сделать это:

(1) Настройка CTEST_OUTPUT_ON_FAILURE переменная среды:

 $ CTEST_OUTPUT_ON_FAILURE=1 make all test
 $ # or CTEST_OUTPUT_ON_FAILURE=1 ctest

(2) Указание --output-on-failure флаг к ctest вызов:

 $ ctest --output-on-failure

Есть ли способ записать файл CMakeLists.txt так, чтобы ctests дампов провалил тесты, выводимые по умолчанию при обычном вызове "сделать все тесты" БЕЗ экспорта глобальной переменной в сеансе или обращения к пользовательской цели, такой как make check (как описано здесь)?

Я знаю о SET_TESTS_PROPERTIES() команда, но пробуя это так:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(testenv CXX)
ENABLE_TESTING()
ADD_EXECUTABLE(hello hello.cpp)
ADD_TEST(testhello hello)

# Following sets the environment variable for the shell in which the test
# progoram 'hello' is run, but not the shell in which ctest is run
SET_TESTS_PROPERTIES(testhello
    PROPERTIES ENVIRONMENT "CTEST_OUTPUT_ON_FAILURE=1")

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

1 ответ

Решение

Встроенный test Цель не может быть изменена, но вы можете добавить пользовательский check цель, которая вызывает ctest с --output-on-failure переключиться следующим образом:

if (CMAKE_CONFIGURATION_TYPES)
    add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} 
        --force-new-ctest-process --output-on-failure 
        --build-config "$<CONFIGURATION>")
else()
    add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} 
        --force-new-ctest-process --output-on-failure)
endif()

Настраиваемая цель должна быть настроена по-разному для сборок одного типа и сборок с несколькими конфигурациями. В последнем случае активная конфигурация сборки должна быть передана ctest вызов с использованием --build-config флаг. --force-new-ctest-process используется встроенным test цель по умолчанию.

Теперь есть переменная списка CMAKE_CTEST_ARGUMENTS в котором вы можете установить аргументы ctest.

https://cmake.org/cmake/help/latest/variable/CMAKE_CTEST_ARGUMENTS.html

Другие вопросы по тегам