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?
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.
Vous pouvez appeler ctest
directement, après avoir créé et réalisé votre projet.
ctest --verbose
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
.
La deuxième façon consiste à obtenir ctest pour vous montrer le contenu des fichiers journaux après l'exécution des tests:
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.
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!
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)
make check CTEST_OUTPUT_ON_FAILURE=TRUE
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.
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.)
Cela rend la sortie du test plus verbeuse:
make test ARGS="-V"
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
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