Як використовувати CMake, як отримати багатослівний вихід із CTest?


109

Я використовую CMake для створення свого проекту. Я додав одиничний тестовий двійковий код, який використовує рамку тестування одиниці Boost. Цей двійковий файл містить усі одиничні тести. Я додав, що двійковий файл повинен управляти CTest:

ADD_EXECUTABLE( tftest test-main.cpp )
ENABLE_TESTING()
ADD_TEST( UnitTests tftest)

Але вихід збірки у Visual Studio показує лише результат запуску CTest:

      Start 1: UnitTests
  1/1 Test #1: UnitTests ................***Failed    0.05 sec

  0% tests passed, 1 tests failed out of 1

Це не дуже допомагає, тому що я не бачу, який тест не вдався. Якщо я запускаю ctest вручну з командного рядка, --verboseя отримую результат тесту Boost unit, який говорить про те, що насправді не вдалося:

1: Test command: tftest.exe
1: Test timeout computed to be: 9.99988e+006
1: Running 4 test cases...
1: test-main.cpp(20): error in "sanity_check3": check 1 == 2 failed
1:
1: *** 1 failure detected in test suite "Master Test Suite"
1/1 Test #1: UnitTests ................***Failed    0.00 sec

Отже, що мені потрібно змінити в CMakeLists.txt, щоб CTest запускався --verboseпостійно? Чи є кращий спосіб використовувати тести Boost unit за допомогою CMake / CTest?


Відповіді:


92

Ви можете встановити змінну середовища CTEST_OUTPUT_ON_FAILURE, яка показуватиме вам будь-який вихід із програми тестування кожного разу, коли тест закінчується. Один із способів зробити це при використанні Makefiles та командного рядка:

env CTEST_OUTPUT_ON_FAILURE=1 make check

Цей запит і відповідь про переповнення стека показує, як встановити змінні середовища у Visual Studio.


3
Не працює для мене (версія ctest 2.8.12.1). Я спробував SET(CTEST_OUTPUT_ON_FAILURE TRUE)і SET(CTEST_OUTPUT_ON_FAILURE ON), але це не має ефекту. Інші повідомлення в Інтернеті підтверджують, що це порушено.
Йоахім Ш

4
@JoachimWuttke set(CTEST_OUTPUT_ON_FAILURE TRUE)не встановлює змінну середовища . Спробуйте це в командному рядку: CTEST_OUTPUT_ON_FAILURE=TRUE make test.
будинок

3
make CTEST_OUTPUT_ON_FAILURE=1 testкоротше і приємніше ІМО.
Timmmm

У пакетному файлі Windows, як використовувати CTEST_OUTPUT_ON_FAILURE = 1 під час виклику - msbuild /toolsversion:15.0 / p: Configuration = Release / p: Platform = x64 TESTS.vcxproj
Toral

34

Ви можете зателефонувати ctestбезпосередньо після створення та створення проекту.

ctest --verbose

29
  1. Ви можете перевірити Testing/Temporaryпідпапку. Він автоматично створюється після запуску make test. Ця папка містить два файли: LastTest.logі LastTestsFailed.log. LastTest.logмістить бажаний вихід для запуску тестів. LastTestFailed.logмістить назви невдалих тестів. Таким чином, ви можете перевірити їх вручну після виконання make test.

  2. Другий спосіб - отримати тест, щоб показати вам вміст файлів журналів після запуску тестів:

    1. помістіть у файл dir (з якого ви запускаєте make test) файл CTestCustom.ctest (це можна зробити , наприклад, за допомогою команди налаштування файлів ) із наступним вмістом

      CTEST_CUSTOM_POST_TEST ("Тестування на кішок / Тимчасовий / LastTest.log")

Замість кота ви можете використовувати будь-яку команду Windows cmd, яка робить подібні речі.

  1. біжи make testзнову і отримуй прибуток!

додаткову інформацію про налаштування ctest ви можете знайти тут . Просто перейдіть до розділу "Налаштування cmake". Удачі!


1
Добре, дякую. Я сподівався, що знайдеться спосіб змінити прапори, які вставляються в проект / makefiles для ctest, але я нічого не знайшов, і ваша відповідь, здається, це підтверджує. Інформація про ім'я файлу є корисною!
Скримслі

1
десь близько ctest 2.8.10 вони зламалися за допомогою зовнішніх команд з аргументами в CTEST_CUSTOM_POST_TEST, див. github.com/openscad/openscad/isissue/260
не яскраво

@don: можливо, вони не проводять достатньо тестів на ctest ;-)
Йоахім

Ця проблема CMake із CTEST_CUSTOM_POST_TEST виправлена ​​в 2.8.12.
Ela782

23

Мені довелося додати «перевірити» ціль самостійно. "робити тести" з якихось причин нічого не робить. Отже, що я зробив (як було запропоновано десь на stackoverflow) - додав цю ціль вручну. Щоб отримати багатослівний вихід, я просто написав це так:

add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} --verbose)

21

Є дуже просте рішення (яке чомусь важко знайти за допомогою Пошуку Google):

ctest --output-on-failure

Якщо ви використовуєте CMake з функцією відкритої папки Visual Studio, ви можете додати його

"ctestCommandArgs": "--output-on-failure"

налаштування для вашої конфігурації збірки.


1
Мені дуже подобається ваше рішення; це не багатослівно, крім випадків відмови.
AnthonyD973

19

make check CTEST_OUTPUT_ON_FAILURE=TRUE


6
Усі голоси, які були прихильні, доволі дивують: це майже рівнозначно прийнятої відповіді, але коротше і приємніше. Також працює в тестованому нами проекті.
zbyszek

2
зробіть CTEST_OUTPUT_ON_FAILURE = 1 тест
Алекс Пуннен


10

Мій підхід - це поєднання відповідей від ony , від zbyszek і from tarc . Я використовую ${CMAKE_COMMAND}змінну (яка встановлена ​​на абсолютний шлях до викликаного файлу cmake) з -E env CTEST_OUTPUT_ON_FAILURE=1аргументом, щоб викликати фактичну команду ctest, використовуючи ${CMAKE_CTEST_COMMAND} -C $<CONFIG>. Щоб допомогти з’ясувати, що відбувається, я починаю з трьох cmake -E echoкоманд, щоб показати поточну робочу директорію та команду ctest, яку потрібно викликати. Ось як я називаю add_custom_target.

add_custom_target(check 
        ${CMAKE_COMMAND} -E echo CWD=${CMAKE_BINARY_DIR}
        COMMAND ${CMAKE_COMMAND} -E echo CMD=${CMAKE_CTEST_COMMAND} -C $<CONFIG>
        COMMAND ${CMAKE_COMMAND} -E echo ----------------------------------
        COMMAND ${CMAKE_COMMAND} -E env CTEST_OUTPUT_ON_FAILURE=1
            ${CMAKE_CTEST_COMMAND} -C $<CONFIG>
    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
    DEPENDS ALL_BUILD
    )

Це добре поєднується з MSVC IDE, де будь-які тестові помилки відображаються як помилки компіляції, що можна натискати. Див. Cmake -E env для документації в cmake -Eрежимі інструментів портативного командного рядка. Я також додаю залежність від ALL_BUILDтого, щоб усі проекти були побудовані до виклику checkцілі. (На Linux будує, один , можливо , буде потрібно замінити ALL_BUILDз ALL;. Я не перевіряв це на Linux ще)


6

Для людей, які використовують Visual Studio, ось ще одна варіація (хак) на тему:

cmake -E env CTEST_OUTPUT_ON_FAILURE=1 cmake --build . --target RUN_TESTS

0

щоб показати результат у XML-файлі, ви повинні виконати тест за допомогою наступної команди

~$ ctest -T Test

і ми знайшли результат у Testing / 1234123432 / test.xml та інші файли, які також генеруються в Тестовій папці


0

ctest -VV або ctest --extra-verbose

З документації :

Увімкніть більше багатослівного виведення з тестів.

Тестовий вихід зазвичай пригнічується і відображається лише зведена інформація. Цей параметр покаже ще більше тестового виводу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.