GoogleTest: परीक्षण कैसे छोड़ें?


119

Google टेस्ट 1.6 (विंडोज 7, विजुअल स्टूडियो सी ++) का उपयोग करना। मैं किसी दिए गए परीक्षण को कैसे बंद कर सकता हूं? (उर्फ मैं एक परीक्षण को चलाने से कैसे रोक सकता हूं)। क्या पूरी परीक्षा में टिप्पणी करने के अलावा मैं कुछ भी कर सकता हूं?

जवाबों:


177

डॉक्स गूगल टेस्ट 1.7 के लिए सुझाव देते हैं :

"यदि आपके पास एक टूटी हुई परीक्षा है जिसे आप तुरंत ठीक नहीं कर सकते हैं, तो आप इसके नाम में DISABLED_ उपसर्ग जोड़ सकते हैं। यह निष्पादन से बाहर कर देगा।"

उदाहरण:

// Tests that Foo does Abc.
TEST(FooTest, DISABLED_DoesAbc) { ... }

class DISABLED_BarTest : public ::testing::Test { ... };

// Tests that Bar does Xyz.
TEST_F(DISABLED_BarTest, DoesXyz) { ... }

1
बस यह भी पाया और फिल्टर
उपयोगकर्ता

@ बिल, मुझे आपकी टिप्पणी पोस्ट करने से ठीक पहले यह मिला ... (और मैंने इसे एक उत्तर के रूप में भी रखा)। मैंने तब अपनी टिप्पणी को हटा दिया, यह अप्रचलित है कि ... लेकिन यह वास्तव में कुछ अच्छी जानकारी है! +1
किरिल

67

दस्तावेज़ीकरण के अनुसार, आप परीक्षणों का एक सबसेट भी चला सकते हैं :

टेस्ट की एक सबसेट चल रहा है

डिफ़ॉल्ट रूप से, एक Google टेस्ट प्रोग्राम उपयोगकर्ता द्वारा परिभाषित सभी परीक्षणों को चलाता है। कभी-कभी, आप केवल परीक्षणों का एक सबसेट (जैसे डिबगिंग के लिए या जल्दी से किसी परिवर्तन की पुष्टि करने के लिए) चलाना चाहते हैं। यदि आप GTEST_FILTER पर्यावरण चर या --gtest_filter ध्वज को फ़िल्टर स्ट्रिंग पर सेट करते हैं, तो Google टेस्ट केवल उन परीक्षणों को चलाएगा जिनके पूर्ण नाम (TestCaseName.TestName के रूप में) फ़िल्टर से मेल खाते हैं।

एक फिल्टर का प्रारूप एक ':' - वाइल्डकार्ड पैटर्न की अलग सूची (सकारात्मक पैटर्न कहा जाता है) वैकल्पिक रूप से एक '-' और दूसरा ':' - अलग पैटर्न सूची (नकारात्मक पैटर्न कहा जाता है)। एक परीक्षण फिल्टर से मेल खाता है यदि और केवल अगर यह किसी भी सकारात्मक पैटर्न से मेल खाता है, लेकिन किसी भी नकारात्मक पैटर्न से मेल नहीं खाता है।

एक पैटर्न में '*' (किसी स्ट्रिंग से मेल खाता है) या 'हो सकता है?' (किसी एक वर्ण से मेल खाता है)। सुविधा के लिए, फ़िल्टर '* -NegativePatterns' को '-NegativePatterns' के रूप में भी लिखा जा सकता है।

उदाहरण के लिए:

./foo_test Has no flag, and thus runs all its tests.
./foo_test --gtest_filter=* Also runs everything, due to the single match-everything * value.
./foo_test --gtest_filter=FooTest.* Runs everything in test case FooTest.
./foo_test --gtest_filter=*Null*:*Constructor* Runs any test whose full name contains either "Null" or "Constructor".
./foo_test --gtest_filter=-*DeathTest.* Runs all non-death tests.
./foo_test --gtest_filter=FooTest.*-FooTest.Bar Runs everything in test case FooTest except FooTest.Bar. 

सबसे सुंदर समाधान नहीं है, लेकिन यह काम करता है।


24

अब आप GTEST_SKIP()स्थैतिक रूप से रनटाइम पर परीक्षण को छोड़ने के लिए मैक्रो का उपयोग कर सकते हैं । उदाहरण के लिए:

TEST(Foo, Bar)
{
    if (blah)
        GTEST_SKIP();

    ...
}

ध्यान दें कि यह एक बहुत ही हाल की सुविधा है, इसलिए आपको इसका उपयोग करने के लिए अपनी GoogleTest लाइब्रेरी को अपडेट करने की आवश्यकता हो सकती है।


यह सुविधा अभी जारी नहीं की गई है। यह संभावना नहीं है कि इसे 1.8.x शाखा में शामिल किया जाएगा, क्योंकि केवल फिक्स वहां स्वीकार किए जाते हैं। 1.9 अभी उपलब्ध नहीं है, इस समय भी घोषित नहीं किया गया है।
ओक्रोक्यूलेट

2
GTEST_SKIP()1.10.0 से उपलब्ध है।
Mattdibi

दुख की बात है कि प्रलेखन अभी भी इस के आसपास दुर्लभ है। ऐसा लगता है कि वहाँ भी है GTEST_SKIP_("some message")(ध्यान रखें अंडरस्कोर)
मैथ्यू ब्रैंडल

19

यहां उन परीक्षणों को शामिल करने की अभिव्यक्ति है जिनके नाम में तार foo1 या foo2 हैं और उन परीक्षणों को बाहर करें जिनके नाम में तार बार 1 या बार 2 हैं:

--gtest_filter=*foo1*:*foo2*-*bar1*:*bar2*

10

मैं इसे कोड में करना पसंद करता हूं:

// Run a specific test only
//testing::GTEST_FLAG(filter) = "MyLibrary.TestReading"; // I'm testing a new feature, run something quickly

// Exclude a specific test
testing::GTEST_FLAG(filter) = "-MyLibrary.TestWriting"; // The writing test is broken, so skip it

मैं या तो सभी परीक्षणों को चलाने के लिए दोनों पंक्तियों पर टिप्पणी कर सकता हूं, किसी एक विशेषता का परीक्षण करने के लिए पहली पंक्ति को अनकम्प्लीट कर सकता हूं कि मैं जांच कर रहा हूं / काम कर रहा हूं, या दूसरी पंक्ति को अनफिल्ट कर रहा हूं यदि कोई परीक्षण टूट गया है, लेकिन मैं बाकी सब परीक्षण करना चाहता हूं।
आप वाइल्डकार्ड्स का उपयोग करके और "MyLibrary.TestNetwork *" या "-MyLibrary.TestFileSystem *" सूची का उपयोग करके सुविधाओं के एक सूट का परीक्षण / बहिष्कार कर सकते हैं।


यह एक बेहतरीन उपाय है। यदि फ़िल्टर खाली है तो मैं कुछ परीक्षणों को डिफ़ॉल्ट रूप से बाहर करने के लिए इसका उपयोग करता हूं। वे के साथ सक्षम किया जा सकता है export GTEST_FILTER='*'
टिम्मम्म

वास्तव में वह काम नहीं करता है क्योंकि डिफ़ॉल्ट " *" नहीं "" है। इसके बजाय मैं सिर्फ एक और पर्यावरण चर का उपयोग करूंगा जो फ़िल्टर को ओवरराइड करता है।
टिम्मम्म

आपने "फ़िल्टर" को कहाँ परिभाषित किया? क्या यह एक तार है?
ब्यासोन

मैं इसे परिभाषित नहीं करता हूं इसलिए मुझे लगता है कि यह gtest / gtest.h से एक वैश्विक शामिल होना चाहिए?
12

6

यदि एक से अधिक परीक्षण की आवश्यकता हो तो उसे छोड़ दिया जाए

--gtest_filter=-TestName.*:TestName.*TestCase

4

एक अन्य दृष्टिकोण के लिए, आप अपने परीक्षणों को एक फ़ंक्शन में लपेट सकते हैं और रनटाइम पर सामान्य सशर्त जांचों का उपयोग कर सकते हैं केवल यदि आप चाहते हैं तो उन्हें निष्पादित करें।

#include <gtest/gtest.h>

const bool skip_some_test = true;

bool some_test_was_run = false;

void someTest() {
   EXPECT_TRUE(!skip_some_test);
   some_test_was_run = true;
}

TEST(BasicTest, Sanity) {
   EXPECT_EQ(1, 1);
   if(!skip_some_test) {
      someTest();
      EXPECT_TRUE(some_test_was_run);
   }
}

यह मेरे लिए उपयोगी है क्योंकि मैं केवल कुछ परीक्षण चलाने की कोशिश कर रहा हूं जब एक सिस्टम दोहरी स्टैक IPv6 का समर्थन करता है।

तकनीकी रूप से कि ड्यूलस्टैक सामान वास्तव में एक इकाई परीक्षण नहीं होना चाहिए क्योंकि यह सिस्टम पर निर्भर करता है। लेकिन मैं वास्तव में किसी भी एकीकरण परीक्षण नहीं कर सकता जब तक कि मैंने परीक्षण नहीं किया है, वैसे भी वे काम करते हैं और यह सुनिश्चित करता है कि यह कोड की गलती नहीं होने पर विफलताओं की रिपोर्ट नहीं करेगा।

इसके परीक्षण के लिए, मेरे पास ऐसी स्टब ऑब्जेक्ट्स हैं जो नकली पॉकेट्स का निर्माण करके दोहरीस्टैक (या कमी) के लिए सिस्टम के समर्थन का अनुकरण करते हैं।

केवल नकारात्मक पक्ष यह है कि परीक्षण आउटपुट और परीक्षणों की संख्या बदल जाएगी जो कुछ ऐसे मुद्दों के साथ समस्या पैदा कर सकती है जो सफल परीक्षणों की संख्या पर नज़र रखता है।

आप EQUAL_ * के बजाय ASSERT_ * का भी उपयोग कर सकते हैं। यदि यह विफल रहता है, तो Assert परीक्षण के बाकी हिस्सों के बारे में होगा। कंसोल पर बहुत अधिक अनावश्यक सामान डंप होने से बचाता है।


4

मुझे सशर्त परीक्षणों की समान आवश्यकता थी, और मैंने एक अच्छा समाधान निकाला। मैंने एक मैक्रो TEST_C को परिभाषित किया है जो TEST_F मैक्रो की तरह काम करता है, लेकिन इसका एक तीसरा पैरामीटर है, जो बूलियन अभिव्यक्ति है, मुख्य रूप से मूल्यांकन रनटाइम का मूल्यांकन किया जाता है। गलत मूल्यांकन करने वाले परीक्षण निष्पादित नहीं किए जाते हैं। मैक्रो बदसूरत है, लेकिन ऐसा दिखता है:

#pragma once
extern std::map<std::string, std::function<bool()> >* m_conditionalTests;
#define TEST_C(test_fixture, test_name, test_condition)\
class test_fixture##_##test_name##_ConditionClass\
{\
    public:\
    test_fixture##_##test_name##_ConditionClass()\
    {\
        std::string name = std::string(#test_fixture) + "." + std::string(#test_name);\
        if (m_conditionalTests==NULL) {\
            m_conditionalTests = new std::map<std::string, std::function<bool()> >();\
        }\
        m_conditionalTests->insert(std::make_pair(name, []()\
        {\
            DeviceInfo device = Connection::Instance()->GetDeviceInfo();\
            return test_condition;\
        }));\
    }\
} test_fixture##_##test_name##_ConditionInstance;\
TEST_F(test_fixture, test_name)

इसके अतिरिक्त, आपके main.cpp में, आपको झूठे का मूल्यांकन करने वाले परीक्षणों को बाहर करने के लिए इस लूप की आवश्यकता है:

// identify tests that cannot run on this device
std::string excludeTests;
for (const auto& exclusion : *m_conditionalTests)
{
    bool run = exclusion.second();
    if (!run)
    {
        excludeTests += ":" + exclusion.first;
    }
}

// add the exclusion list to gtest
std::string str = ::testing::GTEST_FLAG(filter);
::testing::GTEST_FLAG(filter) = str + ":-" + excludeTests;

// run all tests
int result = RUN_ALL_TESTS();

आपने std में "फिल्टर" को कैसे परिभाषित किया: स्ट्रिंग str = :: परीक्षण :: GTEST_FLAG (फ़िल्टर)??
ब्यासोन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.