2012-11-03 2 views
5

Ich habe einen Komponententest, den ich für 200 mögliche Kombinationen von Daten ausführen muss. (Die Produktionsimplementierung enthält die zu testenden Daten in Konfigurationsdateien. Ich weiß, wie man diese Werte vortäuscht). Ich ziehe es vor, für jede Kombination einen separaten Testfall zu schreiben und eine Art des Durchschleifens der Daten zu verwenden. Gibt es so einen direkten Weg mit Google Test für C++? in einem einzigen Test obwohl jeder EintragWie google test für C++ verwendet wird, um Kombinationen von Daten zu durchlaufen

Danke, Karthick

+0

Warum verwenden Sie nicht ein Array von Strukturen, um Ihre Testdaten zu halten, und jeden Eintrag zu durchlaufen? Sie könnten nur einen Testfall haben, der alle Kombinationen testet. –

+0

Hallo Emile, danke für den Vorschlag. Wenn ich es ausprobiert habe, wenn eine Kombination fehlschlägt, wird der Testfall nicht weiter ausgeführt und die Erfolgsrate wird nicht korrekt gemeldet. Am Ende des Tages sind das für mich verschiedene Testfälle. –

Antwort

11

Sie können dafür die gtest Value-parameterized tests verwenden.

Die Verwendung in Verbindung mit dem Combine(g1, g2, ..., gN) Generator klingt wie Ihre beste Wette.

Im folgende Beispiel 2 vector s, einer der int s und die anderen string s, dann mit nur einer einzigen Testvorrichtung schafft Tests für jede Kombination der verfügbaren Werte in dem 2 vector s:

#include <iostream> 
#include <string> 
#include <tuple> 
#include <vector> 
#include "gtest/gtest.h" 

std::vector<int> ints; 
std::vector<std::string> strings; 

class CombinationsTest : 
    public ::testing::TestWithParam<std::tuple<int, std::string>> {}; 

TEST_P(CombinationsTest, Basic) { 
    std::cout << "int: "  << std::get<0>(GetParam()) 
      << " string: \"" << std::get<1>(GetParam()) 
      << "\"\n"; 
} 

INSTANTIATE_TEST_CASE_P(AllCombinations, 
         CombinationsTest, 
         ::testing::Combine(::testing::ValuesIn(ints), 
              ::testing::ValuesIn(strings))); 

int main(int argc, char **argv) { 
    for (int i = 0; i < 10; ++i) { 
    ints.push_back(i * 100); 
    strings.push_back(std::string("String ") + static_cast<char>(i + 65)); 
    } 
    testing::InitGoogleTest(&argc, argv); 
    return RUN_ALL_TESTS(); 
} 
+0

Lassen Sie mich das versuchen und zu Ihnen zurückkommen. –

+0

Funktioniert perfekt. Danke vielmals. –

+0

Wirklich schönes minimales Beispiel, danke. – TimZaman

2

ein Array von Strukturen (bezeichnet als, sagen wir, Combination) die Testdaten und Schleife zu halten. Überprüfen Sie jede Kombination mit EXPECT_EQ anstelle von ASSERT_EQ, damit der Test nicht abgebrochen wird und Sie weitere Kombinationen überprüfen können.

Überlastung operator<< für eine Combination, so dass Sie die Ausgabe kann es zu einem ostream:

ostream& operator<<(ostream& os, const Combination& combo) 
{ 
    os << "(" << combo.field1 << ", " << combo.field2 << ")"; 
    return os; 
} 

Überlastung operator== für eine Combination so dass man leicht zwei Kombinationen für Gleichheit vergleichen:

bool operator==(const Combination& c1, const Combination& c2) 
{ 
    return (c1.field1 == c2.field1) && (c1.field2 == c2.field2); 
} 

Und Der Komponententest könnte in etwa so aussehen:

TEST(myTestCase, myTestName) 
{ 
    int failureCount = 0; 
    for (each index i in expectedComboTable) 
    { 
     Combination expected = expectedComboTable[i]; 
     Combination actual = generateCombination(i); 
     EXPECT_EQ(expected, actual); 
     failureCount += (expected == actual) ? 0 : 1; 
    } 
    ASSERT_EQ(0, failureCount) << "some combinations failed"; 
} 
+0

Lassen Sie mich es versuchen und zu Ihnen zurückkommen. –

+0

Hallo Emile, obwohl das klingt einfach, ich bekomme die Anzahl der Testfälle als 1 sogar für 100er Kombinationen in expectedComboTable ausgeführt. Aus diesem Grund müsste ich das Berichts-Dashboard usw. wiederholen, um die genaue Anzahl der Kombinationen anzugeben, die bei Fällen mit Kombinationen fehlgeschlagen sind. Zu viel Kopfschmerzen. Also, ich werde es nicht benutzen können. Danke für die Idee. –

Verwandte Themen