2016-07-05 11 views
5

için yapıcı argümanlarını belirtin Google testi ile Farklı test durumlarında kullanmak için bir Test fikstürü belirtmek istiyorum. Donanım, veri yönetimi sınıfının bir veri dosyasının adını gerektirdiği TheClass ve veri yönetimi sınıfı TheClassData sınıfındaki nesneleri tahsis edecek ve tahsis edecektir.
Farklı testler için dosya adı değişmelidir.Bir Google test Fikstür

class TheClassTest : public ::testing::Test { 
protected: 
    TheClassTest(std::string filename) : datafile(filename) {} 
    virtual ~TheClassTest() {} 
    virtual void SetUp() { 
    data = new TheClassData(datafile); 
    tc = new TheClass(data); 
    } 
    virtual void TearDown() { 
    delete tc; 
    delete data; 
    } 

    std::string datafile; 
    TheClassData* data; 
    TheClass* tc; 
}; 

Şimdi, farklı testler farklı dosya adları ile fikstür kullanmalıdır:

aşağıdaki Armatür tanımladı. Bunu bir test ortamı oluştururken düşünün.

Soru: Bir testten dosya adını nasıl belirleyebilirim, yani bir fikstürün varsayılan olmayan yapıcısını nasıl çağırırım?

::testing::TestWithParam<T> ve TEST_P gibi bir şey buldum, çünkü farklı değerlerle bir sınama çalıştırmak istemediğimden, ancak bir armatürle farklı sınamalar yapmak istemiyorum.

+0

Bu fikstürü kendiniz mi yürütmek istiyorsunuz? Google test varsayılan test koşucusu, fikstürleri parametrelerle başlatamaz. –

+0

Fikstürü kullanarak bir test (muhtemelen "TEST_F") çalıştırmak istiyorum. Yani cevap, bu mümkün değil mi? Teşekkürler. – Gregor

+0

Bence TestWithParam 've' TEST_P' tam olarak ihtiyacınız olan şeydir. Uygulamada bunları nasıl kullanacağınızı [Gelişmiş Belgeler] (https://github.com/google/googletest/blob/master/googletest/docs/AdvancedGuide.md) adresine bakın. Test örneğini daima test altında (yani "TheClass" olduğunu) sanıyorum. –

cevap

3

Başka bir kullanıcı tarafından önerildiği gibi, varsayılan olmayan bir kurucu kullanarak bir fikstürü başlatarak nu istediğiniz haline getiremezsiniz. Bununla birlikte, başka yollar da vardır. Basitçe testlerde açıkça SetUp fonksiyonu ve çağrısı bu sürümünü aşırı:

class TheClassTest : public ::testing::Test { 
protected: 
    TheClassTest() {} 
    virtual ~TheClassTest() {} 
    void SetUp(const std::string &filename) { 
     data = new TheClassData(filename); 
     tc = new TheClass(data); 
    } 
    virtual void TearDown() { 
     delete tc; 
     delete data; 
    } 

    TheClassData* data; 
    TheClass* tc; 
}; 

Şimdi testi yalnızca dosya adını ayarlamak için bu aşırı kullanmak içinde:

TEST_F(TheClassTest, MyTestCaseName) 
{ 
    SetUp("my_filename_for_this_test_case"); 

    ... 
} 

TearDown otomatik zaman temizler parametresiz test tamamlandı.

+0

Harika. Çok teşekkürler! – Gregor

+0

SetUp yöntemi hala yinelenerek çağrılacak ve bu da SetUp'a iki çağrıyla sonuçlanacaktır. Bu durumda, TearDown yalnızca son ayırmaları silene kadar bir bellek sızıntısı var demektir. SetUp'ı başka bir şeye yeniden adlandırırdım, böylece gtest çağırmaz. – Andreas

+0

Üzgünüm, hatalıyım. 'Setup'nız bir parametre aldığından, gtest tarafından çağrılmayacaktır. SetUp() 'ı, gtest tarafından çağrılan SetUp() ile karıştırılabileceğinden,' SetUp 'adını değiştiririm. – Andreas

0

kullanın Armatürlerinizin için temel sınıf olarak geçerli sınıfı:

class TheClassTestBase : public ::testing::Test { 
protected: 
    TheClassTestBase(std::string filename) : datafile(filename) {} 
    ... 
}; 

her Belirtilen dosya için - kullanım kaynaklı fikstür: Ancak bu ekstra adım parametrelerinin her set için gerekli olan

class TheClassTestForFooTxt : public TheClassTestBase { 
protected: 
    TheClassTestForFooTxt() : TheClassTestBase ("foo.txt") {} 
}; 

- Böylece daha az çaba ile bitirmek için şablonlar veya makroları kullanmaya çalışın. Gibi:

template <typename ClassTestTag> 
struct ClassTestParams 
{ 
    static std::string filename; 
}; 

template<typename ClassTestTag> 
class TheClassTest : public TheClassTestBase { 
protected: 
    TheClassTest() : TheClassTestBase (ClassTestParams<ClassTestTag>::filename) {} 
}; 

Sonra - parametrelerin her set için - bunu:

class FooTxtTag {}; 
template <> std::string ClassTestParams<FooTxtTag>::value = "foo.txt"; 
using TheClassTestForFooTxt = TheClassTest<FooTxtTag>; 
TEST_F(TheClassTestForFooTxt, xxxx) {} 

Ancak - özel durumda - Ben de GoogleTest:type-parameterized-tests çalışacaktı.

+0

Teşekkürler. Bu benim sorunumun boyutu için biraz fazla çaba olduğunu düşünüyorum. – Gregor

İlgili konular