2011-06-06 48 views
13

我想編寫C++ Google測試,它可以使用value-parameterized tests以及不同數據類型的多個參數,理想地匹配以C++/CLI編寫的以下mbUnit測試的複雜性。可以使用多個不同類型的參數匹配mbUnit的靈活性,Googletest value-parameterized參數化嗎?

請注意這是多麼緊湊,[Test]屬性指示這是測試方法和[Row(...)]屬性定義實例的值。

[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); 
    } 
} 

甚至更​​好,從C#這更奇特的測試(推什麼可以在.net中被定義的邊界屬性,超出了在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說:值參數化測試可以讓您只編寫一次測試,然後輕鬆實例化並使用任意數量的參數值運行測試。但我相當確定是指測試用例的數量。

即使沒有改變數據類型,在我看來參數化測試只能採取一個參數?

回答

21

是的,只有一個參數。不過,您可以使該參數變得任意複雜。你可以從你的文檔適應代碼,使用你類型,例如:

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>. 
}; 

然後定義您的參數測試:

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); 
    } 
} 

最後,實例化它:

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

謝謝,搶。對於單個參數使用某種結構是我擔心的解決方案。正如你從編輯中看到的那樣,顯示完整的測試,它確實使得gtest方法比mbUnit/NUnit風格大得多。我只是意識到,對於一個給定的燈具,所有測試都必須進行參數化,而對於.Net測試來說,這是每次測試的選擇。但是,對於不願意使用C++/CLI測試其本機代碼的人來說,gtest參數化仍然比其他本地套件所提供的更好! – 2011-06-06 23:18:07

+0

是的,但如果您需要其他類型的參數,則創建另一個測試夾具很簡單。如果他們都需要類似的設置和拆卸代碼,則可以使用繼承。如果你沒有安裝和拆卸,那麼這個夾具可以*正是我在這裏爲'AndyTest'顯示的代碼。測試的主體不必太大,因爲我的編輯通過引入'p'參數變量來顯示。因爲C++不支持註釋,所以你可能永遠不會得到像.NET測試框架那樣的優雅,所以你總是會有一些單獨的聲明。 – 2011-06-07 01:40:36

+0

@RobKennedy這'Row'屬性是否有文檔..?你能指點我一個鏈接什麼的? – 2013-08-26 13:21:06

相關問題