Пропуск CTest, если цель не была построена - PullRequest
0 голосов
/ 05 февраля 2019

В CMake можно использовать add_subdirectory(foo EXCLUDE_FROM_ALL), чтобы исключить цели, определенные в foo, из построенных по умолчанию , если они не нужны какой-то другой цели, например:

add_subdirectory(foo EXCLUDE_FROM_ALL)
add_custom_target(wanted_foo_targets ALL DEPENDS
  bar_tool  # only build bar_tool from foo
)

Предположим, foo определяет две цели, bar_tool и foo_tool, и тесты для каждой из них:

add_test(NAME test_foo_tool COMMAND foo_tool) 
add_test(NAME test_bar_tool COMMAND bar_tool) 

Когда вы строите общий проект, foo_tool не создается, потому что этоне зависимость от чего-либо, но bar_tool создается, потому что это зависимость wanted_foo_targets.

Но CTest все еще регистрирует инструмент test_foo_tool, который теперь не работает, потому что foo_tool не существует.

Могу ли я удалить / скрыть / пропустить тесты, которые относятся к целям, которые не были построены?Я знаю, что могу сделать команду теста примерно такой, как [ -f foo_tool ] && foo_tool, но это будет ошибочно указывать, что тест пройден.

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

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Это можно сделать с помощью свойства теста SKIP_RETURN_CODE в сочетании с небольшим сценарием драйвера теста (который вы уже рассмотрели с помощью).

В каталоге исходного кода добавьте тестСценарий драйвера с именем test_driver.sh со следующим содержимым:

#!/bin/sh
if [ -x "$1" ] ; then exec "$1" ; else exit 127 ; fi

Сценарий проверяет наличие исполняемого файла теста, переданного в качестве первого аргумента, и завершается с кодом ошибки 127 (он же «команда не найден»), если онне существует.

В вашем CMakeLists.txt добавьте тесты следующим образом:

add_test(NAME test_foo_tool COMMAND "${CMAKE_SOURCE_DIR}/test_driver.sh" $<TARGET_FILE:foo_tool>)
set_tests_properties(test_foo_tool PROPERTIES SKIP_RETURN_CODE 127)

Когда вы запустите тесты с отсутствующим исполняемым файлом foo_tool, ctest сообщит о test_foo_tool как пропущенный тест, но не как неудачный тест.

$ ctest 
...
    Start 1: test_foo_tool
1/2 Test #1: test_foo_tool ....................***Skipped   0.01 sec
    Start 2: test_bar_tool
2/2 Test #2: test_bar_tool ....................   Passed    0.01 sec

100% tests passed, 0 tests failed out of 2

Total Test time (real) =   0.03 sec

The following tests did not run:
      1 - test_foo_tool (Skipped)
0 голосов
/ 05 февраля 2019

Тесты можно отключить, установив свойство DISABLED данного теста.Вы также можете получить список тестов, определенных в подкаталоге, проверив свойство TESTS.

Таким образом, вы сможете использовать get_property, чтобы получить списки всех тестов для этого конкретного каталога.а затем отключите их все.Если необходимо отключить только поднабор тестов, отфильтруйте список всех тестов, используя list(FILTER), только те, которые необходимо отключить.Это удобно только в том случае, если соблюдается соглашение об именах.

К сожалению, set_property может изменять свойство теста только в том же каталоге, а не в подкаталоге.Это означает, что файл CMakeLists.txt необходимо обновить.

В качестве альтернативы, если изменение CMakeLists.txt является слишком большой проблемой, просто не запускайте эти тесты.Это можно сделать с помощью параметра ctest -E regex, чтобы исключить эти тесты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...