Używając CMake, jak uzyskać szczegółowe dane wyjściowe z CTest?

109

Używam CMake do tworzenia mojego projektu. Dodałem plik binarny testu jednostkowego, który korzysta z platformy testów jednostkowych Boost. Ten plik binarny zawiera wszystkie testy jednostkowe. Dodałem ten plik binarny do uruchomienia przez CTest:

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

Ale dane wyjściowe kompilacji w programie Visual Studio pokazują tylko wynik działania CTest:

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

  0% tests passed, 1 tests failed out of 1

Nie jest to zbyt pomocne, ponieważ nie widzę, który test się nie powiódł. Jeśli uruchomię ctest ręcznie z wiersza poleceń --verbose, otrzymam dane wyjściowe z testu jednostkowego Boost, który mówi, co tak naprawdę się nie powiodło:

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

Więc co muszę zmienić w CMakeLists.txt, aby CTest działał przez --verbosecały czas? Czy istnieje lepszy sposób używania testów jednostkowych Boost z CMake / CTest?

Skrymsli
źródło

Odpowiedzi:

92

Możesz ustawić zmienną środowiskową CTEST_OUTPUT_ON_FAILURE, która będzie pokazywać wszelkie dane wyjściowe programu testowego, gdy test zakończy się niepowodzeniem. Jednym ze sposobów, aby to zrobić, używając Makefiles i wiersza poleceń, byłby następujący:

env CTEST_OUTPUT_ON_FAILURE=1 make check

To pytanie i odpowiedź dotyczące przepełnienia stosu pokazują, jak ustawić zmienne środowiskowe w programie Visual Studio.

richq
źródło
3
U mnie nie działa (wersja ctest 2.8.12.1). Próbowałem SET(CTEST_OUTPUT_ON_FAILURE TRUE)i SET(CTEST_OUTPUT_ON_FAILURE ON), ale to nie daje efektu. Inne raporty w sieci potwierdzają, że jest to zepsute.
Joachim W
4
@JoachimWuttke set(CTEST_OUTPUT_ON_FAILURE TRUE)nie ustawia zmiennej środowiskowej . Spróbuj to w wierszu poleceń: CTEST_OUTPUT_ON_FAILURE=TRUE make test.
dom
3
make CTEST_OUTPUT_ON_FAILURE=1 testjest krótsza i ładniejsza IMO.
Timmmm,
W pliku wsadowym systemu Windows, jak używać CTEST_OUTPUT_ON_FAILURE = 1 podczas wywoływania - msbuild /toolsversion:15.0 / p: Configuration = Release / p: Platform = x64 TESTS.vcxproj
Toral
34

Można było zadzwonić ctestbezpośrednio, po obejrzeniu i wykonaniu projektu.

ctest --verbose
Jota Santos
źródło
29
  1. Możesz sprawdzić Testing/Temporarypodfolder. Jest tworzony automatycznie po uruchomieniu make test. Ten folder zawiera dwa pliki: LastTest.logi LastTestsFailed.log. LastTest.logzawiera żądane dane wyjściowe do uruchomienia testów. LastTestFailed.logzawiera nazwy testów zakończonych niepowodzeniem. Możesz więc sprawdzić je ręcznie po wykonaniu make test.

  2. Drugim sposobem jest pobranie ctest, aby pokazać zawartość plików dziennika po uruchomieniu testów:

    1. umieść w katalogu budowania (z którego uruchamiasz make test) plik CTestCustom.ctest (możesz to zrobić np. poleceniem configure file ) z następującą zawartością

      CTEST_CUSTOM_POST_TEST ("testy kota / tymczasowe / LastTest.log")

Zamiast cat możesz użyć dowolnego polecenia cmd systemu Windows, które robi podobne rzeczy.

  1. biegnij make testponownie i zyskaj!

dodatkowe informacje na temat dostosowywania ctest można znaleźć tutaj . Wystarczy przejść do sekcji „Dostosowywanie cmake”. Powodzenia!

beduin
źródło
1
Ok, dzięki. Miałem nadzieję, że będzie sposób na zmodyfikowanie flag, które są wstawiane do plików projektu / makefile dla ctest, ale nic nie znalazłem, a twoja odpowiedź wydaje się to potwierdzać. Informacje o nazwie pliku są pomocne!
Skrymsli
1
gdzieś w okolicach ctest 2.8.10 zepsuli się używając poleceń zewnętrznych z argumentami w CTEST_CUSTOM_POST_TEST patrz github.com/openscad/openscad/issues/260
don bright
@don: może nie przeprowadzają wystarczającej liczby testów na ctest ;-)
Joachim W
Ten problem CMake z CTEST_CUSTOM_POST_TEST został rozwiązany w 2.8.12.
Ela782
23

Musiałem sam dodać cel „sprawdź”. „rób testy” z jakiegoś powodu nic nie robi. Więc co zrobiłem (jak sugerowałem gdzieś na stackoverflow) - dodałem ten cel ręcznie. Aby uzyskać szczegółowe dane wyjściowe, napisałem to tak:

add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} --verbose)
ony
źródło
21

Jest bardzo proste rozwiązanie (które z jakiegoś powodu trudno znaleźć w wyszukiwarce Google):

ctest --output-on-failure

Jeśli używasz CMake z funkcją Otwórz folder programu Visual Studio, możesz dodać

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

ustawienie do konfiguracji kompilacji.

MikeMB
źródło
1
Twoje rozwiązanie bardzo mi się podoba; nie jest gadatliwy, z wyjątkiem błędów.
Anthony D973
19

make check CTEST_OUTPUT_ON_FAILURE=TRUE

zbyszek
źródło
6
Wszystkie głosy przeciwne są raczej zaskakujące: jest to prawie równoważne z zaakceptowaną odpowiedzią, ale krótsze i przyjemniejsze. Działa również w testowanym przeze mnie projekcie.
zbyszek
2
zrobić CTEST_OUTPUT_ON_FAILURE = 1 test
Alex Punnen
11

To sprawia, że ​​wynik testu jest bardziej szczegółowy:

make test ARGS="-V"
Penghe Geng
źródło
10

Moje podejście jest kombinacją odpowiedzi z Ony , od Zbyszka , a od TARC . Używam ${CMAKE_COMMAND}zmiennej (która jest ustawiona na ścieżkę bezwzględną do wywoływanego pliku wykonywalnego cmake) z -E env CTEST_OUTPUT_ON_FAILURE=1argumentem do wywołania rzeczywistego polecenia ctest przy użyciu ${CMAKE_CTEST_COMMAND} -C $<CONFIG>. Aby pomóc wyjaśnić, co się dzieje, zacznę od trzech cmake -E echopoleceń, aby pokazać bieżący katalog roboczy i polecenie ctest, które ma zostać wywołane. Oto jak nazywam 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
    )

Działa to dobrze w MSVC IDE, gdzie wszelkie błędy testowe są wyświetlane jako klikalne błędy kompilacji. Zobacz cmake -E env, aby uzyskać dokumentację cmake -Etrybu przenośnego narzędzia wiersza poleceń. Dodaję również zależność od ALL_BUILD, aby wszystkie projekty zostały zbudowane przed wywołaniem elementu checkdocelowego. (Na Linux buduje, może trzeba wymienić jeden ALL_BUILDz ALL;. Nie testowałem tego jeszcze w systemie Linux)

Phil
źródło
6

Dla osób korzystających z Visual Studio, oto kolejna odmiana (hack) na temat:

cmake -E env CTEST_OUTPUT_ON_FAILURE=1 cmake --build . --target RUN_TESTS
Tarc
źródło
0

aby pokazać wynik w pliku XML, musisz wykonać test za pomocą następującego polecenia

~$ ctest -T Test

i znaleźliśmy wynik w Testing / 1234123432 / test.xml, a inne pliki są również generowane w folderze Testing

Amirouche Zeggagh
źródło
0

ctest -VV lub ctest --extra-verbose

Z dokumentacji :

Włącz bardziej szczegółowe dane wyjściowe z testów.

Dane wyjściowe testu są zwykle pomijane i wyświetlane są tylko informacje podsumowujące. Ta opcja pokaże jeszcze więcej wyników testu.

Daniel Stracaboško
źródło