À l'aide de CMake, comment obtenir une sortie détaillée de CTest?

109

J'utilise CMake pour construire mon projet. J'ai ajouté un binaire de test unitaire qui utilise le cadre de test unitaire Boost. Ce binaire contient tous les tests unitaires. J'ai ajouté ce binaire à exécuter par CTest:

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

Mais la sortie de génération dans Visual Studio affiche uniquement le résultat de l'exécution de CTest:

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

  0% tests passed, 1 tests failed out of 1

Ce n'est pas très utile, car je ne vois pas quel test a échoué. Si j'exécute ctest manuellement à partir de la ligne de commande avec, --verbosej'obtiens la sortie d'un test unitaire Boost qui indique ce qui a réellement échoué:

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

Alors, que dois-je changer dans le CMakeLists.txt pour que CTest fonctionne --verboseà tout moment? Existe-t-il une meilleure façon d'utiliser les tests unitaires Boost avec CMake / CTest?

Skrymsli
la source

Réponses:

92

Vous pouvez définir la variable d'environnement CTEST_OUTPUT_ON_FAILURE, qui vous montrera toute sortie du programme de test chaque fois que le test échoue. Une façon de le faire lors de l'utilisation de Makefiles et de la ligne de commande serait la suivante:

env CTEST_OUTPUT_ON_FAILURE=1 make check

Cette question et réponse de Stack Overflow montre comment définir des variables d'environnement dans Visual Studio.

richq
la source
3
Cela ne fonctionne pas pour moi (ctest version 2.8.12.1). J'ai essayé SET(CTEST_OUTPUT_ON_FAILURE TRUE)et SET(CTEST_OUTPUT_ON_FAILURE ON), mais cela n'a aucun effet. D'autres rapports sur le Web corroborent que cela est cassé.
Joachim W
4
@JoachimWuttke set(CTEST_OUTPUT_ON_FAILURE TRUE)ne définit pas de variable d' environnement . Essayez ceci sur la ligne de commande: CTEST_OUTPUT_ON_FAILURE=TRUE make test.
thehouse
3
make CTEST_OUTPUT_ON_FAILURE=1 testest plus court et plus agréable IMO.
Timmmm
Sur le fichier de commandes Windows, comment utiliser CTEST_OUTPUT_ON_FAILURE = 1 lors de l'appel - msbuild /toolsversion:15.0 / p: Configuration = Release / p: Platform = x64 TESTS.vcxproj
Toral
34

Vous pouvez appeler ctestdirectement, après la réalisation et la réalisation de votre projet.

ctest --verbose
Jota Santos
la source
29
  1. Vous pouvez vérifier le Testing/Temporarysous - dossier. Il est automatiquement créé après l'exécution de make test. Ce dossier contient deux fichiers: LastTest.loget LastTestsFailed.log. LastTest.logcontient la sortie souhaitée pour l'exécution des tests. LastTestFailed.logcontient les noms des tests ayant échoué. Vous pouvez donc les vérifier manuellement après leur exécution make test.

  2. La deuxième façon est d'obtenir ctest pour vous montrer le contenu des fichiers journaux après l'exécution des tests:

    1. placez dans le répertoire de construction (à partir duquel vous exécutez make test) le fichier CTestCustom.ctest (vous pouvez le faire avec la commande configure file , par exemple) avec le contenu suivant

      CTEST_CUSTOM_POST_TEST ("Test de chat / Temporaire / LastTest.log")

Au lieu de cat, vous pouvez utiliser n'importe quelle commande Windows cmd qui fait des choses similaires.

  1. courir à make testnouveau et obtenir des bénéfices!

des informations supplémentaires sur la personnalisation de ctest sont disponibles ici . Passez simplement à la section "Personnalisation de cmake". Bonne chance!

bédouin
la source
1
D'accord merci. J'espérais qu'il y aurait un moyen de modifier les drapeaux qui sont insérés dans le projet / makefiles pour ctest, mais je n'ai rien trouvé et votre réponse semble le confirmer. Les informations sur le nom du fichier sont utiles!
Skrymsli
1
quelque part autour de ctest 2.8.10 ils ont cassé en utilisant des commandes externes avec des arguments dans CTEST_CUSTOM_POST_TEST voir github.com/openscad/openscad/issues/260
don bright
@don: peut-être qu'ils n'exécutent pas assez de tests sur ctest ;-)
Joachim W
Ce problème de CMake avec CTEST_CUSTOM_POST_TEST est résolu dans 2.8.12.
Ela782
23

J'ai dû ajouter moi-même la cible "check". "faire des tests" ne fait rien pour une raison quelconque. Donc ce que j'ai fait (comme cela a été suggéré quelque part sur stackoverflow) - j'ai ajouté cette cible manuellement. Pour obtenir une sortie verbeuse, je viens de l'écrire comme:

add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} --verbose)
seulement
la source
21

Il existe une solution très simple (qui pour une raison quelconque est difficile à trouver via la recherche Google):

ctest --output-on-failure

Si vous utilisez CMake avec la fonction de dossier ouvert de Visual Studio, vous pouvez ajouter le

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

réglage de votre configuration de construction.

MikeMB
la source
1
J'aime beaucoup votre solution; ce n'est pas verbeux sauf en cas d'échec.
AnthonyD973
19

make check CTEST_OUTPUT_ON_FAILURE=TRUE

zbyszek
la source
6
Tous les votes négatifs sont assez surprenants: c'est presque équivalent à la réponse acceptée, mais plus court et plus agréable. Fonctionne également dans le projet que j'ai testé.
zbyszek
2
faire CTEST_OUTPUT_ON_FAILURE = 1 test
Alex Punnen
11

Cela rend la sortie du test plus verbeuse:

make test ARGS="-V"
Penghe Geng
la source
10

Mon approche est une combinaison des réponses de ony , de zbyszek et de tarc . J'utilise la ${CMAKE_COMMAND}variable (qui est définie sur le chemin absolu de l'exécutable cmake appelé) avec l' -E env CTEST_OUTPUT_ON_FAILURE=1argument pour appeler la commande ctest réelle en utilisant ${CMAKE_CTEST_COMMAND} -C $<CONFIG>. Pour aider à clarifier ce qui se passe, je commence par trois cmake -E echocommandes pour afficher le répertoire de travail actuel et la commande ctest à invoquer. Voici comment j'appelle 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
    )

Cela fonctionne bien avec l'IDE MSVC où toutes les erreurs de test sont affichées comme des erreurs de compilation cliquables. Voir cmake -E env pour la documentation du cmake -Emode d'outil de ligne de commande portable. J'ajoute également une dépendance sur ALL_BUILDafin que tous les projets soient construits avant d'appeler la checkcible. (Sur les versions Linux, il peut être nécessaire de le remplacer ALL_BUILDpar ALL; je n'ai pas encore testé cela sous Linux.)

Phil
la source
6

Pour les personnes utilisant Visual Studio, voici une autre variante (hack) sur le thème:

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

pour afficher le résultat avec un fichier XML, vous devez exécuter le test avec la commande suivante

~$ ctest -T Test

et nous avons trouvé le résultat dans Testing / 1234123432 / test.xml et d'autres fichiers sont également générés dans le dossier de test

Amirouche Zeggagh
la source
0

ctest -VV ou ctest --extra-verbose

De la documentation :

Activez une sortie plus détaillée des tests.

La sortie de test est normalement supprimée et seules les informations récapitulatives sont affichées. Cette option affichera encore plus de sortie de test.

Daniel Stracaboško
la source