web-dev-qa-db-fra.com

En utilisant CMake, comment puis-je obtenir une sortie détaillée de CTest?

J'utilise CMake pour construire mon projet. J'ai ajouté un binaire de test unitaire qui utilise le cadre de test unitaire Boost. Ce seul 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 depuis la ligne de commande avec --verbose J'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 s'exécute avec --verbose de tout temps? Existe-t-il une meilleure façon d'utiliser les tests unitaires Boost avec CMake/CTest?

87
Skrymsli

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 Stack Overflow montre comment définir les variables d'environnement dans Visual Studio.

74
richq

Vous pouvez appeler ctest directement, après avoir créé et réalisé votre projet.

ctest --verbose
29
Jamillo Santos
  1. Vous pouvez vérifier le Testing/Temporary sous-dossier. Il est automatiquement créé après l'exécution du test de make. Ce dossier contient deux fichiers: LastTest.log et LastTestsFailed.log. LastTest.log contient la sortie souhaitée pour les tests d'exécution. LastTestFailed.log contient les noms des tests ayant échoué. Vous pouvez donc les vérifier manuellement après avoir exécuté make test.

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

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

      CTEST_CUSTOM_POST_TEST ("Test 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 test encore une fois et obtenez des bénéfices!

des informations supplémentaires sur la personnalisation de ctest que vous pouvez trouver ici . Passez simplement à la section "Personnalisation de cmake". Bonne chance!

27
beduin

J'ai dû ajouter la cible "check" par moi-même. "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 détaillée, je l'ai simplement écrit comme ceci:

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

make check CTEST_OUTPUT_ON_FAILURE=TRUE

15
zbyszek

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"

définissant votre configuration de construction.

14
MikeMB

Mon approche est une combinaison des réponses de ony , de zbyszek , et de tarc . Je utilise le ${CMAKE_COMMAND} variable (qui est définie sur le chemin absolu de l'exécutable cmake appelé) avec -E env CTEST_OUTPUT_ON_FAILURE=1 argument pour appeler la commande ctest réelle à l'aide de ${CMAKE_CTEST_COMMAND} -C $<CONFIG>. Pour aider à clarifier ce qui se passe, je commence par trois cmake -E echo commandes 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 joue Nice avec le MSVC IDE où toutes les erreurs de test sont affichées comme des erreurs de compilation cliquables. Voir cmake -E env pour la documentation du cmake -E mode outil de ligne de commande portable. J'ajoute également une dépendance sur ALL_BUILD pour que tous les projets soient construits avant d'appeler la cible check. (Sur les versions Linux, il peut être nécessaire de remplacer ALL_BUILD avec ALL; Je ne l'ai pas encore testé sur Linux.)

10
Phil

Cela rend la sortie du test plus verbeuse:

make test ARGS="-V"
9
Penghe Geng

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
6
Tarc

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 le fichier Testing/1234123432/test.xml et d'autres fichiers sont également générés dans le dossier Testing

0
Amirouche Zeggagh