GoogleTest: Wie überspringe ich einen Test?

Lesezeit: 6 Minuten

Benutzer-Avatar
Benutzer

Verwendung von Google Test 1.6 (Windows 7, Visual Studio C++). Wie kann ich einen bestimmten Test deaktivieren? (auch bekannt als wie kann ich verhindern, dass ein Test ausgeführt wird). Was kann ich tun, außer den ganzen Test zu kommentieren?

Benutzer-Avatar
Rechnung

Das Dokumente für Google-Test 1.7 empfehlen:

Wenn Sie einen fehlerhaften Test haben, den Sie nicht sofort reparieren können, können Sie den hinzufügen DISABLED_ Präfix zu seinem Namen. Dadurch wird es von der Ausführung ausgeschlossen. Dies ist besser, als den Code zu kommentieren oder zu verwenden #if 0da deaktivierte Tests weiterhin kompiliert werden (und daher nicht verrotten).

Beispiel aus obiger Dokumentation:

// Tests that Foo does Abc.
TEST(FooTest, DISABLED_DoesAbc) { ... }

class DISABLED_BarTest : public testing::Test { ... };

// Tests that Bar does Xyz.
TEST_F(DISABLED_BarTest, DoesXyz) { ... }

  • habe es auch gerade gefunden und filtert

    – Benutzer

    26. August 2011 um 17:01 Uhr

  • @Bill, ich habe es gefunden, kurz bevor Sie Ihren Kommentar gepostet haben … (und ich habe es auch als Antwort angegeben). Ich habe dann meinen Kommentar entfernt, weil ich dachte, dass er veraltet ist … aber das sind wirklich gute Informationen! +1

    – Kiril

    26. August 2011 um 17:05 Uhr


  • Aber das Deaktivieren ist kein Überspringen. Das Überspringen ist ein vorübergehend nicht verfügbarer Zustand (z. B. nicht mit dem Internet verbunden) und wird nur dynamisch im Setup-Aufruf erkannt. Ich erwähne es nur, da dies 11 Jahre später das Google-Ergebnis Nr. 1 ist

    – Lothar

    7. April um 9:00 Uhr

Benutzer-Avatar
Kiril

Du kannst auch Führen Sie eine Teilmenge von Tests auslaut Dokumentation:

Ausführen einer Teilmenge der Tests

Standardmäßig führt ein Google-Testprogramm alle Tests aus, die der Benutzer definiert hat. Manchmal möchten Sie nur eine Teilmenge der Tests ausführen (z. B. zum Debuggen oder schnellen Überprüfen einer Änderung). Wenn Sie die Umgebungsvariable GTEST_FILTER oder das Flag –gtest_filter auf eine Filterzeichenfolge setzen, führt Google Test nur die Tests aus, deren vollständige Namen (in Form von TestCaseName.TestName) mit dem Filter übereinstimmen.

Das Format eines Filters ist eine ‘:’-getrennte Liste von Wildcard-Mustern (als positive Muster bezeichnet), optional gefolgt von einem ‘-‘ und einer weiteren ‘:’-getrennten Musterliste (als negative Muster bezeichnet). Ein Test stimmt mit dem Filter genau dann überein, wenn er mit einem der positiven Muster, aber nicht mit einem der negativen Muster übereinstimmt.

Ein Muster kann ‘*’ (entspricht einer beliebigen Zeichenfolge) oder ‘?’ (entspricht jedem einzelnen Zeichen). Der Einfachheit halber kann der Filter „*-NegativePatterns“ auch als „-NegativePatterns“ geschrieben werden.

Zum Beispiel:

./foo_test Has no flag, and thus runs all its tests.
./foo_test --gtest_filter=* Also runs everything, due to the single match-everything * value.
./foo_test --gtest_filter=FooTest.* Runs everything in test case FooTest.
./foo_test --gtest_filter=*Null*:*Constructor* Runs any test whose full name contains either "Null" or "Constructor".
./foo_test --gtest_filter=-*DeathTest.* Runs all non-death tests.
./foo_test --gtest_filter=FooTest.*-FooTest.Bar Runs everything in test case FooTest except FooTest.Bar. 

Nicht die schönste Lösung, aber es funktioniert.

  • In meinem Fall muss ich die Filterbedingung in Anführungszeichen setzen, da * als Platzhalter erkannt wird.

    – dt

    21. April um 9:51 Uhr

Benutzer-Avatar
Peter Bloomfield

Sie können jetzt die verwenden GTEST_SKIP() Makro, um einen Test zur Laufzeit bedingt zu überspringen. Zum Beispiel:

TEST(Foo, Bar)
{
    if (blah)
        GTEST_SKIP();

    ...
}

Beachten Sie, dass dies ein sehr ist aktuelle Funktion Daher müssen Sie möglicherweise Ihre GoogleTest-Bibliothek aktualisieren, um sie verwenden zu können.

  • Diese Funktion ist noch nicht freigegeben. Es ist unwahrscheinlich, dass es in einen 1.8.x-Zweig aufgenommen wird, da dort nur Korrekturen akzeptiert werden. 1.9 ist noch nicht verfügbar, noch nicht einmal angekündigt.

    – Okrokette

    14. April 2019 um 7:11 Uhr

  • GTEST_SKIP() ist ab 1.10.0 verfügbar.

    – mattdibi

    25. März 2020 um 17:02 Uhr

  • Leider ist die Dokumentation dazu noch spärlich. Scheint es auch zu geben GTEST_SKIP_("some message") (beachten Sie den abschließenden Unterstrich)

    – Brandlingo

    16. April 2020 um 15:27 Uhr

  • Es ist #define GTEST_SKIP() GTEST_SKIP_("") in gtest.h um eine optionale Skip-Nachricht zuzulassen.

    – Sebkrämer

    18. November 2020 um 7:47 Uhr

Benutzer-Avatar
Aschtosch

Hier ist der Ausdruck, um Tests einzuschließen, deren Namen die Zeichenfolgen foo1 oder foo2 enthalten, und Tests auszuschließen, deren Namen die Zeichenfolgen bar1 oder bar2 enthalten:

--gtest_filter=*foo1*:*foo2*-*bar1*:*bar2*

Ich ziehe es vor, es in Code zu tun:

// Run a specific test only
//testing::GTEST_FLAG(filter) = "MyLibrary.TestReading"; // I'm testing a new feature, run something quickly

// Exclude a specific test
testing::GTEST_FLAG(filter) = "-MyLibrary.TestWriting"; // The writing test is broken, so skip it

Ich kann entweder beide Zeilen auskommentieren, um alle Tests auszuführen, die erste Zeile auskommentieren, um eine einzelne Funktion zu testen, die ich untersuche/an der ich arbeite, oder die zweite Zeile auskommentieren, wenn ein Test fehlerhaft ist, ich aber alles andere testen möchte.
Sie können auch eine Reihe von Funktionen testen/ausschließen, indem Sie Platzhalter verwenden und eine Liste schreiben, „MyLibrary.TestNetwork*“ oder „-MyLibrary.TestFileSystem*“.

  • Dies ist eine großartige Lösung. Ich verwende es, um einige Tests standardmäßig auszuschließen, wenn der Filter leer ist. Sie können mit aktiviert werden export GTEST_FILTER='*'.

    – Timmm

    13. Juli 2017 um 14:24 Uhr

  • Eigentlich funktioniert das nicht, weil die Voreinstellung “*” nicht “”. Stattdessen verwende ich einfach eine andere Umgebungsvariable, die den Filter überschreibt.

    – Timmm

    13. Juli 2017 um 14:36 ​​Uhr

  • Wo hast du den “Filter” definiert? Ist es eine Schnur?

    – Beasone

    19. Februar 2019 um 21:34 Uhr

  • Ich definiere es nicht, also denke ich, dass es ein globaler Bestandteil von gtest/gtest.h sein muss?

    – pilch

    20. Februar 2019 um 12:56 Uhr

Benutzer-Avatar
Vijay C

Wenn mehr als ein Test erforderlich ist, überspringen Sie ihn

--gtest_filter=-TestName.*:TestName.*TestCase

  • Dies ist eine großartige Lösung. Ich verwende es, um einige Tests standardmäßig auszuschließen, wenn der Filter leer ist. Sie können mit aktiviert werden export GTEST_FILTER='*'.

    – Timmm

    13. Juli 2017 um 14:24 Uhr

  • Eigentlich funktioniert das nicht, weil die Voreinstellung “*” nicht “”. Stattdessen verwende ich einfach eine andere Umgebungsvariable, die den Filter überschreibt.

    – Timmm

    13. Juli 2017 um 14:36 ​​Uhr

  • Wo hast du den “Filter” definiert? Ist es eine Schnur?

    – Beasone

    19. Februar 2019 um 21:34 Uhr

  • Ich definiere es nicht, also denke ich, dass es ein globaler Bestandteil von gtest/gtest.h sein muss?

    – pilch

    20. Februar 2019 um 12:56 Uhr

Benutzer-Avatar
David C. Bischof

Bei einem anderen Ansatz können Sie Ihre Tests in eine Funktion packen und zur Laufzeit normale Bedingungsprüfungen verwenden, um sie nur dann auszuführen, wenn Sie dies wünschen.

#include <gtest/gtest.h>

const bool skip_some_test = true;

bool some_test_was_run = false;

void someTest() {
   EXPECT_TRUE(!skip_some_test);
   some_test_was_run = true;
}

TEST(BasicTest, Sanity) {
   EXPECT_EQ(1, 1);
   if(!skip_some_test) {
      someTest();
      EXPECT_TRUE(some_test_was_run);
   }
}

Dies ist nützlich für mich, da ich versuche, einige Tests nur durchzuführen, wenn ein System Dual-Stack-IPv6 unterstützt.

Technisch gesehen sollte dieses Dualstack-Zeug kein Unit-Test sein, da es vom System abhängt. Aber ich kann keine wirklichen Integrationstests durchführen, bis ich getestet habe, dass sie trotzdem funktionieren, und dies stellt sicher, dass keine Fehler gemeldet werden, wenn es nicht an den Codes liegt.

Was den Test betrifft, habe ich Stub-Objekte, die die Unterstützung eines Systems für Dualstack (oder das Fehlen von) simulieren, indem sie gefälschte Sockets konstruieren.

Der einzige Nachteil ist, dass sich die Testausgabe und die Anzahl der Tests ändern, was zu Problemen mit etwas führen kann, das die Anzahl erfolgreicher Tests überwacht.

Sie können auch ASSERT_* anstelle von EQUAL_* verwenden. Bestätigen Sie den Rest des Tests, wenn er fehlschlägt. Verhindert, dass viele redundante Inhalte auf die Konsole übertragen werden.

1019120cookie-checkGoogleTest: Wie überspringe ich einen Test?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy