Wie erhalte ich mit CMake eine ausführliche Ausgabe von CTest?

109

Ich verwende CMake, um mein Projekt zu erstellen. Ich habe eine Unit-Test-Binärdatei hinzugefügt, die das Boost-Unit-Test-Framework verwendet. Diese eine Binärdatei enthält alle Komponententests. Ich habe diese Binärdatei hinzugefügt, die von CTest ausgeführt werden soll:

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

Die Build-Ausgabe in Visual Studio zeigt jedoch nur das Ergebnis der Ausführung von CTest:

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

  0% tests passed, 1 tests failed out of 1

Dies ist nicht sehr hilfreich, da ich nicht sehen kann, welcher Test fehlgeschlagen ist. Wenn ich ctest manuell über die Befehlszeile mit ausführe, erhalte --verboseich die Ausgabe eines Boost-Unit-Tests, der angibt , was tatsächlich fehlgeschlagen ist:

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

Was muss ich also in der Datei CMakeLists.txt ändern, damit CTest --verbosejederzeit ausgeführt wird? Gibt es eine bessere Möglichkeit, Boost-Unit-Tests mit CMake / CTest zu verwenden?

Skrymsli
quelle

Antworten:

92

Sie können die Umgebungsvariable festlegen CTEST_OUTPUT_ON_FAILURE, die Ihnen die Ausgabe des Testprogramms anzeigt, wenn der Test fehlschlägt. Eine Möglichkeit, dies bei Verwendung von Makefiles und der Befehlszeile zu tun, wäre folgende:

env CTEST_OUTPUT_ON_FAILURE=1 make check

Diese Frage und Antwort zum Stapelüberlauf zeigt, wie Umgebungsvariablen in Visual Studio festgelegt werden.

richq
quelle
3
Funktioniert bei mir nicht (ctest version 2.8.12.1). Ich habe es versucht SET(CTEST_OUTPUT_ON_FAILURE TRUE)und SET(CTEST_OUTPUT_ON_FAILURE ON), aber es hat keine Wirkung. Andere Berichte im Web bestätigen, dass dies nicht funktioniert.
Joachim W
4
@JoachimWuttke set(CTEST_OUTPUT_ON_FAILURE TRUE)legt keine Umgebungsvariable fest . Versuchen Sie dies in der Befehlszeile : CTEST_OUTPUT_ON_FAILURE=TRUE make test.
Thehouse
3
make CTEST_OUTPUT_ON_FAILURE=1 testist kürzer und schöner IMO.
Timmmm
In einer Windows-Batchdatei wird CTEST_OUTPUT_ON_FAILURE = 1 beim Aufrufen verwendet - msbuild /toolsversion:15.0 / p: Configuration = Release / p: Platform = x64 TESTS.vcxproj
Toral
34

Sie können ctestdirekt anrufen , nachdem Sie Ihr Projekt erstellt und erstellt haben.

ctest --verbose
Jota Santos
quelle
29
  1. Sie können den Testing/TemporaryUnterordner überprüfen . Es wird automatisch erstellt, nachdem make test ausgeführt wurde. Dieser Ordner enthält zwei Dateien: LastTest.logund LastTestsFailed.log. LastTest.logenthält die gewünschte Ausgabe für Lauftests. LastTestFailed.logenthält Namen fehlgeschlagener Tests. Sie können sie also nach der Ausführung manuell überprüfen make test.

  2. Die zweite Möglichkeit besteht darin, ctest zu erhalten, um Ihnen den Inhalt von Protokolldateien nach dem Ausführen von Tests anzuzeigen:

    1. Platzieren Sie im Build-Verzeichnis (von dem aus Sie ausführen make test) die Datei CTestCustom.ctest (Sie können dies beispielsweise mit dem Befehl configure file tun ) mit folgendem Inhalt

      CTEST_CUSTOM_POST_TEST ("cat Testing / Temporary / LastTest.log")

Anstelle von cat können Sie auch einen beliebigen Windows-Befehl cmd verwenden, der ähnliche Aktionen ausführt.

  1. Laufen Sie make testerneut und erzielen Sie Gewinn!

Weitere Informationen zum Anpassen von ctest finden Sie hier . Gehen Sie einfach zum Abschnitt "Anpassen von cmake". Viel Glück!

Beduin
quelle
1
Okay danke. Ich hatte gehofft, dass es eine Möglichkeit geben würde, die Flags zu ändern, die in das Projekt / die Makefiles für ctest eingefügt werden, aber ich habe nichts gefunden und Ihre Antwort scheint dies zu bestätigen. Die Dateinameninfo ist hilfreich!
Skrymsli
1
Irgendwo um ctest 2.8.10 herum sind sie mit externen Befehlen mit Argumenten in CTEST_CUSTOM_POST_TEST kaputt gegangen, siehe github.com/openscad/openscad/issues/260
don bright
@don: Vielleicht führen sie nicht genug Tests auf ctest durch ;-)
Joachim W
Das CMake-Problem mit CTEST_CUSTOM_POST_TEST wurde in 2.8.12 behoben.
Ela782
23

Ich musste das "Check" -Ziel selbst hinzufügen. "make tests" macht aus irgendeinem Grund nichts. Also, was ich getan habe (wie irgendwo im Stackoverflow vorgeschlagen) - ich habe dieses Ziel manuell hinzugefügt. Um eine ausführliche Ausgabe zu erhalten, habe ich es einfach so geschrieben:

add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} --verbose)
nur
quelle
21

Es gibt eine sehr einfache Lösung (die aus irgendeinem Grund über die Google-Suche schwer zu finden ist):

ctest --output-on-failure

Wenn Sie CMake mit der Open Folder-Funktion von Visual Studio verwenden, können Sie die hinzufügen

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

Einstellung zu Ihrer Build-Konfiguration.

MikeMB
quelle
1
Ich mag Ihre Lösung sehr; Es ist nicht ausführlich, außer bei Misserfolg.
AnthonyD973
19

make check CTEST_OUTPUT_ON_FAILURE=TRUE

zbyszek
quelle
6
Alle Abstimmungen sind ziemlich überraschend: Dies entspricht fast der akzeptierten Antwort, ist aber kürzer und schöner. Funktioniert auch in dem von mir getesteten Projekt.
Zbyszek
2
machen CTEST_OUTPUT_ON_FAILURE = 1 Test
Alex Punnen
11

Dies macht die Testausgabe ausführlicher:

make test ARGS="-V"
Penghe Geng
quelle
10

Mein Ansatz ist eine Kombination der Antworten von ony , von zbyszek und von tarc . Ich verwende die ${CMAKE_COMMAND}Variable (die auf den absoluten Pfad zur aufgerufenen ausführbaren cmake-Datei gesetzt ist) mit dem -E env CTEST_OUTPUT_ON_FAILURE=1Argument, um den tatsächlichen ctest-Befehl mit aufzurufen ${CMAKE_CTEST_COMMAND} -C $<CONFIG>. Um zu verdeutlichen, was los ist, beginne ich mit drei cmake -E echoBefehlen, um das aktuelle Arbeitsverzeichnis und den aufzurufenden Befehl ctest anzuzeigen. So rufe ich an 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
    )

Dies funktioniert gut mit der MSVC-IDE, bei der alle Testfehler als anklickbare Kompilierungsfehler angezeigt werden. In cmake -E env finden Sie eine Dokumentation des cmake -Etragbaren Befehlszeilen-Tool-Modus. Ich füge auch eine Abhängigkeit hinzu, ALL_BUILDdamit alle Projekte erstellt werden, bevor das checkZiel aufgerufen wird . (Bei Linux-Builds muss möglicherweise Folgendes ersetzt ALL_BUILDwerden ALL. Ich habe dies noch nicht unter Linux getestet.)

Phil
quelle
6

Für Benutzer von Visual Studio gibt es hier eine weitere Variante (Hack) des Themas:

cmake -E env CTEST_OUTPUT_ON_FAILURE=1 cmake --build . --target RUN_TESTS
Tarc
quelle
0

Um das Ergebnis mit einer XML-Datei anzuzeigen, müssen Sie den Test mit dem folgenden Befehl ausführen

~$ ctest -T Test

und wir haben das Ergebnis in der Datei Testing / 1234123432 / test.xml gefunden, und andere Dateien werden ebenfalls im Testordner generiert

Amirouche Zeggagh
quelle
0

ctest -VV oder ctest --extra-verbose

Aus der Dokumentation :

Aktivieren Sie eine ausführlichere Ausgabe von Tests.

Die Testausgabe wird normalerweise unterdrückt und nur zusammenfassende Informationen werden angezeigt. Diese Option zeigt noch mehr Testausgaben an.

Daniel Stracaboško
quelle