2016-07-05 9 views
5

के लिए कन्स्ट्रक्टर तर्क निर्दिष्ट करें Google परीक्षण के साथ मैं विभिन्न परीक्षण मामलों में उपयोग के लिए एक परीक्षण स्थिरता निर्दिष्ट करना चाहता हूं। स्थिरता कक्षा TheClass और इसकी डेटा प्रबंधन कक्षा TheClassData की वस्तुओं को आवंटित और हटाएगी, जहां डेटा प्रबंधन वर्ग को डेटाफ़ाइल का नाम आवश्यक है।
विभिन्न परीक्षणों के लिए, फ़ाइल का नाम अलग-अलग होना चाहिए।Google परीक्षण स्थिरता

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

अब, विभिन्न परीक्षणों अलग फ़ाइल नाम के साथ स्थिरता का उपयोग करना चाहिए:

मैं निम्नलिखित स्थिरता को परिभाषित किया। कल्पना करें कि यह एक परीक्षण वातावरण स्थापित करने के रूप में है।

प्रश्न: मैं परीक्षण से फ़ाइल नाम कैसे निर्दिष्ट कर सकता हूं, यानी एक स्थिरता के गैर-डिफ़ॉल्ट कन्स्ट्रक्टर को कैसे कॉल करें?

मुझे ::testing::TestWithParam<T> और TEST_P जैसी चीजें मिलीं, जो मदद नहीं करती हैं, क्योंकि मैं अलग-अलग मूल्यों के साथ एक परीक्षण नहीं करना चाहता हूं, लेकिन एक स्थिरता के साथ विभिन्न परीक्षण।

+0

तो क्या आप खुद को उस स्थिरता को चलाने के लिए चाहते हैं? गूगल टेस्ट डिफॉल्ट टेस्ट रनर पैरामीटर के साथ फिक्स्चर को तुरंत चालू नहीं कर सकता है। –

+0

मैं स्थिरता का उपयोग कर एक परीक्षण (शायद 'TEST_F') चलाने के लिए चाहता हूं। तो जवाब यह है कि यह संभव नहीं है? धन्यवाद। – Gregor

+0

मुझे लगता है कि 'TestWithParam ' और 'TEST_P' बिल्कुल वही है जो आपको चाहिए। [उन्नत डॉक्स] देखें (https://github.com/google/googletest/blob/master/googletest/docs/AdvancedGuide.md) अभ्यास में उनका उपयोग कैसे करें। टेस्टकेस के अंदर आप हमेशा परीक्षण के तहत इंस्टेंस को तुरंत चालू कर सकते हैं (मुझे लगता है कि यह 'TheClass' है)। –

उत्तर

3

जैसा कि किसी अन्य उपयोगकर्ता द्वारा सुझाया गया है, आप एक गैर-डिफ़ॉल्ट कन्स्ट्रक्टर का उपयोग करके एक स्थिरता को तत्काल करके प्राप्त नहीं कर सकते हैं। हालांकि, अन्य तरीके हैं। सीधे शब्दों में परीक्षण में स्पष्ट रूप से SetUp समारोह और कॉल उस संस्करण को ओवरलोड:

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

अब में परीक्षण बस फ़ाइल नाम स्थापित करने के लिए इस अधिभार का उपयोग करें:

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

    ... 
} 

parameterless TearDown स्वचालित रूप से जब साफ होगा परीक्षण पूरा हो गया है।

+0

ग्रेट। आपका बहुत बहुत धन्यवाद! – Gregor

+0

सेटअप विधि अभी भी gtest द्वारा बुलाया जाएगा, जिसके परिणामस्वरूप सेटअप को दो कॉल होंगे ... इसलिए इस मामले में एक मेमोरी रिसाव है क्योंकि टियरडाउन केवल अंतिम आवंटन को हटा देता है। मैं कुछ और चीज़ों के लिए सेटअप का नाम बदलूंगा ताकि gtest इसे कॉल न करे। – Andreas

+0

क्षमा करें, मैं गलत हूँ। चूंकि आपका 'सेटअप' पैरामीटर लेता है, इसलिए इसे gtest द्वारा नहीं कहा जाएगा। मैं कुछ और चीज़ों के लिए 'SetUp' का नाम बदलूंगा क्योंकि इसे' SetUp() 'से भ्रमित किया जा सकता है जिसे gtest द्वारा बुलाया जाता है। – Andreas

0

उपयोग आपकी जुड़नार के लिए एक आधार वर्ग के रूप में वर्तमान वर्ग: हर विशिष्ट फ़ाइल नाम के लिए

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

- उपयोग व्युत्पन्न स्थिरता:

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

हालांकि इस अतिरिक्त कदम मापदंडों के प्रत्येक सेट के लिए आवश्यक है - इसलिए आप इसे कम प्रयास के साथ करने के लिए टेम्पलेट्स या मैक्रोज़ का उपयोग करने का प्रयास कर सकते हैं। जैसा:

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

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

तब - मापदंडों के प्रत्येक सेट के लिए - करना है कि:

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

हालांकि - अपने विशिष्ट मामले में - मैं भी GoogleTest:type-parameterized-tests की कोशिश करेंगे।

+0

धन्यवाद। मुझे लगता है कि यह मेरी समस्या के आकार के लिए थोड़ा अधिक प्रयास है। – Gregor

संबंधित मुद्दे