2011-06-06 10 views
13

C++ Google testleri yazmak istiyorum, bu da value-parameterized tests'u farklı veri tiplerinde birden fazla parametreyle kullanabiliyor, ideal olarak C++/CLI ile yazılmış aşağıdaki mbUnit testlerinin karmaşıklığını karşılayabiliyor.Birden çok, farklı parametre türü ile Googletest değeri parametreleştirilmiş mbUnit esnekliği ile eşleşebilir mi?

Bunun ne kadar küçük olduğunu, bunun bir test yöntemi ve bir örnekleme için değerleri tanımlayan [Row(...)] öznitelikleri olduğunu belirten [Test] özniteliği olduğunu unutmayın.

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

Hatta daha da iyisi, C# bu daha egzotik testi (Net tanımlanabilir olanın sınırlarını zorluyoruz C++/CLI mümkün olanın ötesine nitelikleri):

[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) 
{ 
... 
} 

helpdiyor Değer parametreli testler, testinizi sadece bir kez yazmanıza izin verir ve daha sonra, keyfi sayıda parametre değeriyle kolayca başlatabilir ve çalıştırabilir. ama test vakalarının sayısına atıfta bulunduğu kesin olarak eminim.

bile veri türleri değişken olmadan, bir parametreli test sadece bir parametreyi alabilir geliyor bana?

cevap

21

Evet, tek bir parametre var. Yine de, bu parametrenin keyfi olarak karmaşık olmasını sağlayabilirsiniz. Örneğin, size türü kullanmak belgelerinden kod adapte olabilir:

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

Sonra parametreli testi tanımlayın:

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

, örnekleriz:

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

Teşekkür, Rob. Tek bir parametre için bir çeşit yapı kullanmak, çözümden korktuğum şeydi. Tam testi göstermek için düzenlememden görebileceğiniz gibi, gtest yaklaşımını mbUnit/NUnit stilinden çok daha zor hale getirir. Ben de, belirli bir fikstürün, .Net olanlar için her bir test için bir seçim olmakla kıyaslandığında, parametrelenmesi gereken TÜM testlere olan taahhüdünün gerçekleştiğini fark ettim. Ancak, yerel kodlarını test etmek için C++/CLI kullanmaya isteksiz olan kişiler için, gtest parametrelemesi diğer yerel kitler tarafından sunulan hiçbir şeyden daha iyidir! –

+0

Evet, ancak başka bir parametre türü istiyorsanız başka bir test donanımı oluşturmanın önemsiz. Hepsi benzer kurulum ve göz atma koduna ihtiyaç duyarlarsa kalıtımı kullanabilirsiniz. Kurulumunuz ve teardown'ınız yoksa, fikstür * * burada * AndyTest için gösterdiğim kod olabilir. Düzenlemelerim p 'parametre değişkenini tanıtarak gösterdiği gibi, testlerin gövdeleri çok daha zorlayıcı olmak zorunda değildir. C++, ek açıklamaları desteklemediğinden, büyük olasılıkla * epey * .Net test çerçeveleri kadar şık olamazsınız. Bu nedenle, her zaman birkaç ayrı bildiriminiz olacaktır. –

+0

@RobKennedy Bu 'Satır' özelliklerinin belgeleri var mı ..? Beni bir linke veya bir şeye yönlendirir misin? –

İlgili konular