So führen Sie bestimmte Testfälle in GoogleTest aus

125

Ich versuche, eine Funktion / Methode für mein Projekt zu schreiben, die den Benutzer fragt, welche Testfälle Sie ausführen werden. Es sieht aus wie unten ...,

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

Die Herausforderung besteht nun darin, dass ich beim Ausführen des Projekts gefragt werde, welche Testfälle Sie ausführen möchten. Wenn ich Test_Cases_1und wähle Test_Cases_N. Dann sollte es diese beiden Testfälle ausführen und alle anderen ausschließen Test_Cases_2 to ..... Im Ergebnisfenster möchte ich auch die Ergebnisse von Test_Cases_1und sehen Test_Cases_N.

Wenn ich also den GoogleTest sehe, gibt es eine Methode namens test_case_to_run_count(); Aber alle test caseswerden mit der Test_F () -Methode registriert. Also habe ich viele Analysen durchgeführt, aber immer noch keine Lösung gefunden. Bitte hilf mir.

Rasmi Ranjan Nayak
quelle

Antworten:

181

Sie können erweiterte Optionen verwenden , um Google-Tests auszuführen.

Um nur einige Komponententests auszuführen, können Sie die --gtest_filter=Test_Cases1*Befehlszeilenoption mit einem Wert verwenden, der die Platzhalter *und und ?für den Abgleich mit mehreren Tests akzeptiert . Ich denke, es wird Ihr Problem lösen.

UPD:

Nun, das war die Frage , wie man läuft spezifische Testfälle. Die Integration von gtest in Ihre GUI ist eine andere Sache, die ich nicht wirklich kommentieren kann, da Sie keine Details zu Ihrem Ansatz angegeben haben. Ich glaube jedoch, dass der folgende Ansatz ein guter Anfang sein könnte:

  1. Holen Sie sich alle Testfälle, indem Sie Tests mit ausführen --gtest_list_tests
  2. Analysieren Sie diese Daten in Ihrer GUI
  3. Wählen Sie die Testfälle aus, die ausgeführt werden sollen
  4. Führen Sie die ausführbare Testdatei mit der Option aus --gtest_filter
Nogard
quelle
Ich würde dies empfehlen, und wenn Sie ein auf Eingabeaufforderungen basierendes System benötigen, würde ich vorschlagen, ein Wrapper-Skript zu erstellen, das die Benutzereingaben erhält und das Testprogramm entsprechend ausführt.
Boycy
@nogard: Ja, Sie haben Recht, aber mein / unser Ziel ist es, eine GUI zu haben, die das Treevon TestCasesund hat TestNo. Glaubst du, es --gtest_filter=..wird helfen?
Rasmi Ranjan Nayak
@nogard: Vielen Dank für die Hilfe ... Ich werde weitermachen, wie Sie es angewiesen haben. Ich werde Sie wissen lassen, sobald ich fertig bin.
Rasmi Ranjan Nayak
1
@nogard: Ich mache das Gleiche, wie du es dir befohlen hast. 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();...}Es werden jedoch nur der Testfall und TestNo gedruckt. und aber es führt die Tests nicht aus. Wie kann ich die Tests jetzt ausführen?
Rasmi Ranjan Nayak
@RasmiRanjanNayak: Ich habe vorgeschlagen, die Hauptleitung überhaupt nicht zu ändern. Ich schlage vor, Tests zweimal auszuführen: 1. Mal mit --gtest_list_tests, dann 2. Mal für die ausgewählten Tests mit der Option --gtest_filter
nogard
91

Fassen Sie die Antworten von @Rasmi Ranjan Nayak und @nogard zusammen und fügen Sie eine weitere Option hinzu:

Auf der Konsole

Sie sollten die Flagge verwenden --gtest_filter, wie

--gtest_filter=Test_Cases1*

(Sie können dies auch unter Eigenschaften | Konfigurationseigenschaften | Debugging | Befehlsargumente tun.)

Auf die Umwelt

Sie sollten die Variable GTEST_FILTERwie folgt einstellen

export GTEST_FILTER = "Test_Cases1*"

Auf dem Code

Sie sollten eine Flagge setzen filter, wie

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

so dass Ihre Hauptfunktion so etwas wie wird

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

Weitere Informationen zur Syntax der Zeichenfolge, die Sie verwenden können, finden Sie im Abschnitt Ausführen einer Teilmenge der Tests .

Jorge Leitão
quelle
6
sehr nützlich der Teil "Auf dem Code" !! Das habe ich gesucht !!
Iero
28

Schließlich bekam ich eine Antwort: ::test::GTEST_FLAG(list_tests) = true;// Von Ihrem Programm, nicht von der Konsole.

Wenn Sie --gtest_filter =*; /* =*, =xyz*... etc*/// verwenden möchten, müssen Sie sie in der Konsole verwenden.

Meine Anforderung ist es also, sie über das Programm und nicht über die Konsole zu verwenden.

Updated:-

Endlich habe ich die Antwort für die Aktualisierung des Programms erhalten.

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

Also, danke für alle Antworten.

Ihr Leute seid großartig.

Rasmi Ranjan Nayak
quelle