Utilizzando CMake, come ottengo un output dettagliato da CTest?


109

Sto usando CMake per creare il mio progetto. Ho aggiunto un binario di unit test che utilizza il framework di unit test Boost. Questo binario contiene tutti gli unit test. Ho aggiunto quel binario per essere eseguito da CTest:

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

Ma l'output di compilazione in Visual Studio mostra solo il risultato dell'esecuzione di CTest:

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

  0% tests passed, 1 tests failed out of 1

Questo non è molto utile, perché non riesco a vedere quale test ha fallito. Se eseguo ctest manualmente dalla riga di comando con --verboseottengo l'output da uno unit test Boost che dice cosa effettivamente non è riuscito:

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

Quindi, cosa devo cambiare in CMakeLists.txt per far funzionare CTest --verbosein ogni momento? C'è un modo migliore per utilizzare i test unitari Boost con CMake / CTest?


Risposte:


92

È possibile impostare la variabile di ambiente CTEST_OUTPUT_ON_FAILURE, che mostrerà qualsiasi output dal programma di test ogni volta che il test fallisce. Un modo per farlo quando si usano Makefile e la riga di comando sarebbe il seguente:

env CTEST_OUTPUT_ON_FAILURE=1 make check

Questa domanda e risposta di Stack Overflow mostra come impostare le variabili di ambiente in Visual Studio.


3
Non funziona per me (ctest versione 2.8.12.1). Ho provato SET(CTEST_OUTPUT_ON_FAILURE TRUE)e SET(CTEST_OUTPUT_ON_FAILURE ON), ma non ha alcun effetto. Altri rapporti nel web confermano che questo non funziona.
Joachim W

4
@JoachimWuttke set(CTEST_OUTPUT_ON_FAILURE TRUE)non imposta una variabile d' ambiente . Prova questo sulla riga di comando: CTEST_OUTPUT_ON_FAILURE=TRUE make test.
thehouse

3
make CTEST_OUTPUT_ON_FAILURE=1 testè più breve e più bello IMO.
Timmmm

Sul file batch di Windows, come utilizzare CTEST_OUTPUT_ON_FAILURE = 1 durante la chiamata - msbuild /toolsversion:15.0 / p: Configuration = Release / p: Platform = x64 TESTS.vcxproj
Toral

34

Puoi chiamare ctestdirettamente, dopo aver creato e realizzato il tuo progetto.

ctest --verbose

29
  1. Puoi controllare la Testing/Temporarysottocartella. Viene creato automaticamente dopo aver eseguito make test. Questa cartella contiene due file: LastTest.loge LastTestsFailed.log. LastTest.logcontiene l'output desiderato per l'esecuzione dei test. LastTestFailed.logcontiene i nomi dei test falliti. Quindi puoi controllarli manualmente dopo l'esecuzione make test.

  2. Il secondo modo è ottenere ctest per mostrarti il ​​contenuto dei file di registro dopo aver eseguito i test:

    1. inserisci nella directory build (da cui esegui make test) il file CTestCustom.ctest (puoi farlo con il comando configure file , ad esempio) con i seguenti contenuti

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

Invece di cat puoi usare qualsiasi comando cmd di Windows che faccia cose simili.

  1. corri di make testnuovo e guadagna!

ulteriori informazioni sulla personalizzazione di ctest puoi trovare qui . Basta passare alla sezione "Personalizzazione di cmake". In bocca al lupo!


1
Va bene, grazie. Speravo che ci fosse un modo per modificare i flag inseriti nel progetto / makefile per ctest, ma non ho trovato nulla e la tua risposta sembra confermarlo. Le informazioni sul nome del file sono utili!
Skrymsli

1
da qualche parte intorno a ctest 2.8.10 hanno fallito usando comandi esterni con argomenti in CTEST_CUSTOM_POST_TEST vedi github.com/openscad/openscad/issues/260
don brillante

@don: forse non stanno eseguendo abbastanza test su ctest ;-)
Joachim W

Il problema di CMake con CTEST_CUSTOM_POST_TEST è stato risolto in 2.8.12.
Ela782

23

Ho dovuto aggiungere da solo l'obiettivo di "controllo". "fare test" non fa nulla per qualche motivo. Quindi quello che ho fatto (come è stato suggerito da qualche parte su StackOverflow) - ho aggiunto questo obiettivo manualmente. Per ottenere un output dettagliato, l'ho appena scritto come:

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

21

C'è una soluzione molto semplice (che per qualche motivo è difficile da trovare tramite Ricerca Google):

ctest --output-on-failure

Se usi CMake con la funzione cartella aperta di Visual Studio, puoi aggiungere il file

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

impostazione alla configurazione della build.


1
Mi piace molto la tua soluzione; non è prolisso se non in caso di fallimento.
Anthony D973

19

make check CTEST_OUTPUT_ON_FAILURE=TRUE


6
Tutti i voti negativi sono piuttosto sorprendenti: questo è quasi equivalente alla risposta accettata, ma più breve e più piacevole. Funziona anche nel progetto che ho testato.
zbyszek

2
make CTEST_OUTPUT_ON_FAILURE = 1 test
Alex Punnen

11

Ciò rende l'output del test più dettagliato:

make test ARGS="-V"

10

Il mio approccio è una combinazione delle risposte da girarci intorno , da Zbyszek , e da tarc . Uso la ${CMAKE_COMMAND}variabile (che è impostata sul percorso assoluto dell'eseguibile cmake richiamato) con l' -E env CTEST_OUTPUT_ON_FAILURE=1argomento per invocare il comando ctest effettivo utilizzando ${CMAKE_CTEST_COMMAND} -C $<CONFIG>. Per aiutare a chiarire cosa sta succedendo, inizio con tre cmake -E echocomandi per mostrare la directory di lavoro corrente e il comando ctest da invocare. Ecco come chiamo 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
    )

Questo funziona bene con l'IDE MSVC in cui eventuali errori di test vengono visualizzati come errori di compilazione cliccabili. Vedere cmake -E env per la documentazione della cmake -Emodalità dello strumento da riga di comando portatile. Aggiungo anche una dipendenza in ALL_BUILDmodo che tutti i progetti vengano compilati prima di invocare l' checkobiettivo. (Su build Linux, potrebbe essere necessario sostituire ALL_BUILDcon ALL; Non l'ho ancora testato su Linux.)


6

Per le persone che utilizzano Visual Studio, ecco un'altra variazione (hack) sul tema:

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

0

per visualizzare il risultato con file XML è necessario eseguire il test con il seguente comando

~$ ctest -T Test

e abbiamo trovato il risultato in Testing / 1234123432 / test.xml e altri file sono generati anche nella cartella Testing


0

ctest -VV o ctest --extra-verbose

Dalla documentazione :

Abilita un output più dettagliato dai test.

L'output del test viene normalmente soppresso e vengono visualizzate solo le informazioni di riepilogo. Questa opzione mostrerà ancora più output di prova.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.