2011-06-06 13 views
13

Chciałbym napisać testy Google C++, które mogą używać value-parameterized tests z wieloma parametrami różnych typów danych, idealnie dopasowując się do złożoności następujących testów mbUnit napisanych w C++/CLI.Czy wartość Googletest-parametryzowana z wieloma różnymi typami parametrów jest odpowiednia do elastyczności mbUnit?

Należy zwrócić uwagę, jak jest to kompaktowe, z atrybutem [Test] wskazującym, że jest to metoda testowa i atrybuty określające wartości dla instancji.

[Test] 
[Row("Empty.mdb", "select count(*) from collar", 0)] 
[Row("SomeCollars.mdb", "select count(*) from collar", 17)] 
[Row("SomeCollars.mdb", "select count(*) from collar where max_depth=100", 4)] 
void CountViaDirectSQLCommand(String^ dbname, String^ command, int numRecs) 
{ 
    String^ dbFilePath = testDBFullPath(dbname); 
    { 
     StAnsi fpath(dbFilePath); 
     StGdbConnection db(fpath); 
     db->Connect(fpath); 
     int result = db->ExecuteSQLReturningScalar(StAnsi(command)); 
     Assert::AreEqual(numRecs, result); 
    } 
} 

Albo jeszcze lepiej, tym bardziej egzotyczne testy z C# (przesuwa granice tego, co można zdefiniować w .NET atrybuty poza to, co jest możliwe w C++/CLI):

[Test] 
[Row("SomeCollars.mdb", "update collar set x=0.003 where hole_id='WD004'", "WD004", 
    new string[] { "x", "y" }, 
    new double[] { 0.003, 7362.082 })] // y value unchanged 
[Row("SomeCollars.mdb", "update collar set x=1724.8, y=6000 where hole_id='WD004'", "WD004", 
    new string[] { "x", "y" }, 
    new double[] { 1724.8, 6000.0 })] 
public void UpdateSingleRowByKey(string dbname, string command, string idValue, string[] fields, double[] values) 
{ 
... 
} 

help mówi Testy z wartością sparametryzowaną pozwolą Ci napisać test tylko raz, a następnie łatwo utworzyć instancję i uruchomić z dowolną liczbą wartości parametrów., ale jestem dość pewny, że odnosi się do liczby przypadków testowych.

Nawet bez zmiany typów danych, wydaje mi się, że sparametryzowany test może przyjmować tylko parametr jeden?

Odpowiedz

21

Tak, istnieje jeden parametr. Możesz jednak uczynić ten parametr dowolnie złożonym. Można dostosowania kod z dokumentacją korzystać ci typu, na przykład:

class AndyTest : public ::testing::TestWithParam<Row> { 
    // You can implement all the usual fixture class members here. 
    // To access the test parameter, call GetParam() from class 
    // TestWithParam<T>. 
}; 

Następnie zdefiniować parametryczne Test:

TEST_P(AndyTest, CountViaDirectSQLCommand) 
{ 
    // Call GetParam() here to get the Row values 
    Row const& p = GetParam(); 
    std::string dbFilePath = testDBFullPath(p.dbname); 
    { 
    StAnsi fpath(dbFilePath); 
    StGdbConnection db(p.fpath); 
    db.Connect(p.fpath); 
    int result = db.ExecuteSQLReturningScalar(StAnsi(p.command)); 
    EXPECT_EQ(p.numRecs, result); 
    } 
} 

Wreszcie instancję:

INSTANTIATE_TEST_CASE_P(InstantiationName, AndyTest, ::testing::Values(
    Row("Empty.mdb", "select count(*) from collar", 0), 
    Row("SomeCollars.mdb", "select count(*) from collar", 17), 
    Row("SomeCollars.mdb", "select count(*) from collar where max_depth=100", 4) 
)); 
+1

Dzięki, Obrabować. Używanie jakiejś struktury dla pojedynczego parametru było tym, czego obawiałem się, że byłoby rozwiązaniem. Jak widać z mojej edycji, aby pokazać pełny test, czyni to podejście gtest dużo większym niż styl mbUnit/NUnit. Właśnie zdałem sobie sprawę, że istnieje również zobowiązanie do WSZYSTKICH testów dla danego urządzenia, które muszą być sparametryzowane w porównaniu do tego, że jest to wybór dla testu dla tych .Net. Jednak dla ludzi, którzy nie chcą używać C++/CLI do testowania swojego natywnego kodu, parametryzacja gtest jest wciąż lepsza niż nic, co oferują inne natywne zestawy! –

+0

Tak, ale bycie kolejnym urządzeniem testowym jest trywialne, jeśli chcemy uzyskać inny typ parametru. Możesz użyć dziedziczenia, jeśli wszystkie wymagają podobnego kodu konfiguracji i zagospodarowania. Jeśli nie masz ustawień i rozłączenia, to urządzenie może być * dokładnie * kodem, który pokazałem tutaj dla 'AndyTest'. Ciała testów nie muszą być dużo większe, jak pokazuje moja edycja, wprowadzając zmienną parametru 'p'. Prawdopodobnie nigdy nie dostaniesz * całkiem * tak eleganckiego jak platformy testowe .Net, ponieważ C++ nie obsługuje adnotacji, więc zawsze będziesz mieć kilka oddzielnych deklaracji. –

+0

@RobKennedy Czy ten atrybut "wiersza" zawiera dokumentację ...? Czy możesz wskazać mi link lub coś takiego? –

Powiązane problemy