Comment exécuter des cas de test spécifiques dans GoogleTest

125

J'essaie d'écrire une fonction / méthode pour mon projet, qui demandera à l'utilisateur quels cas de test allez-vous exécuter? On dirait ci-dessous ...,

Test_Cases_1
         |_TestNo1
         |_TestNo2....so on
Test_Cases_2
         |_TestNo1
         |_TestNo2....so on
....
....so on
Test_Cases_N
         |_TestNo1
         |_TestNo2....so on

Donc, maintenant, le défi est lors de l'exécution du projet, il devrait me demander quels sont tous les cas de test que vous souhaitez exécuter? Si je sélectionne Test_Cases_1et Test_Cases_N. Ensuite, il doit exécuter ces deux cas de test et exclure tous les autres de Test_Cases_2 to ..... Dans la fenêtre de résultats aussi, je voudrais voir les résultats de Test_Cases_1et Test_Cases_N.

Donc, si je vois le GoogleTest, il existe une méthode appelée test_case_to_run_count(); Mais tous test casessont enregistrés avec la méthode Test_F (). J'ai donc fait beaucoup d'analyses, mais je n'ai toujours pas trouvé de solution. Aidez-moi, s'il vous plaît.

Rasmi Ranjan Nayak
la source

Réponses:

181

Vous pouvez utiliser des options avancées pour exécuter des tests Google.

Pour exécuter uniquement certains tests unitaires, vous pouvez utiliser l' --gtest_filter=Test_Cases1*option de ligne de commande avec une valeur qui accepte les caractères génériques *et ?pour la correspondance avec plusieurs tests. Je pense que cela résoudra votre problème.

UPD:

Eh bien, la question était de savoir comment exécuter des cas de test spécifiques. L'intégration de gtest avec votre GUI est une autre chose, que je ne peux pas vraiment commenter, car vous n'avez pas fourni de détails sur votre approche. Cependant, je pense que l'approche suivante pourrait être un bon début:

  1. Obtenez toutes les cas de test en exécutant des tests avec --gtest_list_tests
  2. Analyser ces données dans votre interface graphique
  3. Sélectionnez les scénarios de test que vous souhaitez exécuter
  4. Exécuter le test exécutable avec option --gtest_filter
Nogard
la source
Je le recommande, et si vous avez besoin d'un système basé sur une invite, je vous suggère de créer un script wrapper qui obtient l'entrée de l'utilisateur et exécute le programme de test en conséquence.
boycy
@nogard: Oui, vous avez raison, mais mon / notre objectif est d'avoir une interface graphique, qui aura le Treeof TestCaseset TestNo. Alors, pensez-vous que --gtest_filter=..cela aidera?
Rasmi Ranjan Nayak
@nogard: Merci beaucoup pour l'aide ... J'irai de l'avant comme vous l'avez indiqué .. Je vous le ferai savoir une fois que j'aurai terminé.
Rasmi Ranjan Nayak
1
@nogard: je fais la même chose que vous avez réalisé; int main(int argc, char **argv) { //::testing::GTEST_FLAG(list_tests) = true; // For Testing InitGoogleTest(&argc, argv); ::testing::GTEST_FLAG(list_tests) = true; ........ RUN_ALL_TEST();...}Mais il n'imprime que le Testcase et le TestNo. et mais il n'exécute pas les tests. Alors, comment puis-je exécuter les tests maintenant?
Rasmi Ranjan Nayak
@RasmiRanjanNayak: J'ai proposé de ne pas changer du tout le principal. Je propose d'exécuter des tests deux fois: 1ère fois avec --gtest_list_tests, puis 2ème exécution pour les tests sélectionnés avec l'option --gtest_filter
nogard
91

Résumer les réponses @Rasmi Ranjan Nayak et @nogard et ajouter une autre option:

Sur la console

Vous devriez utiliser le drapeau --gtest_filter, comme

--gtest_filter=Test_Cases1*

(Vous pouvez également le faire dans Propriétés | Propriétés de configuration | Débogage | Arguments de commande)

Sur l'environnement

Vous devez définir la variable GTEST_FILTERcomme

export GTEST_FILTER = "Test_Cases1*"

Sur le code

Vous devriez définir un drapeau filter, comme

::testing::GTEST_FLAG(filter) = "Test_Cases1*";

de sorte que votre fonction principale devienne quelque chose comme

int main(int argc, char **argv) {
    ::testing::InitGoogleTest(&argc, argv);
    ::testing::GTEST_FLAG(filter) = "Test_Cases1*";
    return RUN_ALL_TESTS();
}

Voir la section Exécution d'un sous-ensemble des tests pour plus d'informations sur la syntaxe de la chaîne que vous pouvez utiliser.

Jorge Leitão
la source
6
très utile la partie "Sur le code" !! C'est ce que je cherchais!!
Iero
28

Enfin, j'ai une réponse, ::test::GTEST_FLAG(list_tests) = true;// De votre programme, pas de la console Wrt.

Si vous souhaitez utiliser --gtest_filter =*; /* =*, =xyz*... etc*/// Vous devez les utiliser dans la console.

Donc, mon exigence est de les utiliser à partir du programme et non de la console.

Updated:-

Enfin, j'ai eu la réponse pour mettre à jour la même chose dans le programme.

 ::testing::GTEST_FLAG(filter) = "*Counter*:*IsPrime*:*ListenersTest.DoesNotLeak*";//":-:*Counter*";
      InitGoogleTest(&argc, argv);
RUN_ALL_TEST();

Alors, merci pour toutes les réponses.

Vous êtes formidables.

Rasmi Ranjan Nayak
la source