Google C ++ टेस्टिंग फ्रेमवर्क में कस्टम संदेश कैसे भेजें?


83

मैं अपने कोड के यूनिट परीक्षण के लिए Google C ++ टेस्टिंग फ्रेमवर्क का उपयोग करता हूं। मैं आउटपुट विश्लेषण के लिए C ++ यूनिट परीक्षण मॉड्यूल के साथ ग्रहण सीडीटी का उपयोग करता हूं ।

पहले मैंने CppUnit का उपयोग किया था इसमें मैक्रोस परिवार CPPUNIT * _MESSAGE है जिसे इस तरह कहा जा सकता है:

CPPUNIT_ASSERT_EQUAL_MESSAGE("message",EXPECTED_VALUE,ACTUAL_VALUE)

और आउटपुट परीक्षण करने के लिए कस्टम संदेश भेजने की अनुमति देता है।

क्या Google परीक्षण आउटपुट में कुछ कस्टम टेक्स्ट शामिल करने का कोई तरीका है?

(अधिमानतः वह तरीका जिसमें डेटा को संदेश शामिल किया जा सकता है जो Google परीक्षण का उपयोग करके स्वचालित इकाई परीक्षण के लिए मौजूदा कार्यक्रमों द्वारा पढ़ा जाता है।)

जवाबों:


160

जब परीक्षण विफल हो जाता है, तो मैजेस्ट मैक्रो नैदानिक ​​संदेशों के आउटपुट के लिए एक धारा लौटाता है।

EXPECT_TRUE(false) << "diagnostic message";

@ErikAronesty क्या आपने स्रोत में एक नज़र डाली है कि यह देखने के लिए कि डेटा के साथ इंटरफेस करने का एक आसान तरीका है?
kayleeFrye_onDeck

2
यदि आपको परिणाम की परवाह किए बिना पाठ को प्रिंट करने की आवश्यकता है, तो बस इसे stdout में लिखें। लेकिन यह आमतौर पर बहुत शोर परीक्षणों का परिणाम है, साथ काम करना मुश्किल है।
ऑड्रियस मेस्कॉस्कस

विफल () << "नैदानिक ​​संदेश"; उसी तरह काम करता है, लेकिन यह उत्पन्न आउटपुट को कुछ पंक्तियों से कम करता है क्योंकि यह आपको वास्तविक मूल्य, अपेक्षित मूल्य और इतने पर नहीं बताता है, जो यह सभी EXPECT_X () मैक्रोज़ के लिए करता है। बस अगर आप आउटपुट की लंबाई को थोड़ा कम करना चाहते हैं।
बैलिस्टिकटोमेटो

61

Gtest के वर्तमान संस्करण में इसे सफाई से करने का कोई तरीका नहीं है। मैंने कोड को देखा, और केवल पाठ आउटपुट (gtest "संदेश" में लिपटे) दिखाया गया है यदि आप एक परीक्षण में विफल रहते हैं

हालाँकि, कुछ बिंदु पर, gtest printfस्क्रीन पर 'ing' शुरू करता है, और आप इसके ऊपर के स्तर का लाभ उठा सकते हैं जो कि रंग प्लेटफ़ॉर्म स्वतंत्र हैं।

यहां वह हैक किया गया मैक्रो है जो आप चाहते हैं। यह gtest आंतरिक पाठ रंग का उपयोग करता है। बेशक internal::नामस्थान चेतावनी की घंटी बज रही होनी चाहिए, लेकिन हे, यह काम करता है।

उपयोग:

TEST(pa_acq,Foo)
{
  // C style
  PRINTF("Hello world \n");

  // or C++ style

  TEST_COUT << "Hello world" << std::endl;
}

आउटपुट:

उदाहरण आउटपुट

कोड:

namespace testing
{
 namespace internal
 {
  enum GTestColor {
      COLOR_DEFAULT,
      COLOR_RED,
      COLOR_GREEN,
      COLOR_YELLOW
  };

  extern void ColoredPrintf(GTestColor color, const char* fmt, ...);
 }
}
#define PRINTF(...)  do { testing::internal::ColoredPrintf(testing::internal::COLOR_GREEN, "[          ] "); testing::internal::ColoredPrintf(testing::internal::COLOR_YELLOW, __VA_ARGS__); } while(0)

// C++ stream interface
class TestCout : public std::stringstream
{
public:
    ~TestCout()
    {
        PRINTF("%s",str().c_str());
    }
};

#define TEST_COUT  TestCout()

धन्यवाद, यह सही समाधान है, IMHO। लेकिन क्या मैं \nकक्षा के अंदर PRINTF में जोड़ने का सुझाव दे सकता हूं ? ऐसा इसलिए है क्योंकि हम TEST_COUT के साथ लाइनों में शामिल नहीं हो सकते हैं जैसा कि हम करते हैं std::cout, इसलिए उपयोगकर्ता को उसके साथ जोड़ने देना बेकार है \n। वैसे भी धन्यवाद!
हैप्पी कैक्टस

1
दुर्भाग्य से यह दृष्टिकोण अब Google टेस्ट के आधुनिक संस्करणों के साथ काम नहीं करता है - testing::internal::ColoredPrintfजनता के लिए अब उपलब्ध नहीं है :(
लालकृष्ण

17

इसे करने के लिए एक बहुत ही सरल और आसान तरीका है (आंतरिक कक्षाओं में गोताखोरी की आवश्यकता के बिना या नए कस्टम वर्ग बनाने के लिए)।

बस एक मैक्रो को परिभाषित करें:

#define GTEST_COUT std::cerr << "[          ] [ INFO ]"

और अपने परीक्षणों में उपयोग GTEST_COUT(बस की तरह cout):

GTEST_COUT << "Hello World" << std::endl;

और आप ऐसे परिणाम देखेंगे:

यहाँ छवि विवरण दर्ज करें

अपनी खोज के लिए श्रेय @Martin Nowak को जाता है ।


5

मार्क लकाता के जवाब का संदर्भ लें, यहां मेरा तरीका है:

Step1: एक हेडर फ़ाइल बनाएँ, उदाहरण के लिए: gtest_cout.h

कोड:

#ifndef _GTEST_COUT_H_
#define _GTEST_COUT_H_

#include "gtest/gtest.h"

namespace testing
{
namespace internal
{
enum GTestColor
{
    COLOR_DEFAULT, COLOR_RED, COLOR_GREEN, COLOR_YELLOW
};
extern void ColoredPrintf(GTestColor color, const char* fmt, ...);
}
}

#define GOUT(STREAM) \
    do \
    { \
        std::stringstream ss; \
        ss << STREAM << std::endl; \
        testing::internal::ColoredPrintf(testing::internal::COLOR_GREEN, "[          ] "); \
        testing::internal::ColoredPrintf(testing::internal::COLOR_YELLOW, ss.str().c_str()); \
    } while (false); \

#endif /* _GTEST_COUT_H_ */

Step2: GOUTअपने gtest में उपयोग करें

उपयोग:

#include "gtest_cout.h"

TEST(xxx, yyy)
{
    GOUT("Hello world!");
}

हाल ही के संस्करण में ColoredPrintf को स्थिर बनाया गया है, इसलिए यह हैक और काम नहीं करेगा।
schwart

3

आपको नीचे परिभाषित करना चाहिए:

static class LOGOUT {
public:
    LOGOUT() {}
    std::ostream&  info() {
        std::cout << "[info      ] ";
        return std::cout;
    }

} logout;

इसका उपयोग करते हुए:

logout.info() << "test: " << "log" << std::endl;

0

से उन्नत googletest विषय आप उस उद्देश्य के लिए कुछ मैक्रो का उपयोग कर सकते हैं।

  • SUCCEED () SUCCEED() << "success/info message"; SUCCEED () केवल आपके संदेश और आय को आउटपुट करता है। यह परीक्षण के रूप में पारित नहीं करता है। इसका परिणाम निम्न मुखर द्वारा निर्धारित किया जाएगा।
  • विफल () FAIL() << "test failure message"; विफल () आपके परीक्षण को विफल के रूप में चिह्नित करता है, आपके संदेश को आउटपुट करता है और फिर फ़ंक्शन से लौटता है। इसलिए केवल शून्य लौटाने वाले कार्यों में उपयोग किया जा सकता है।
  • ADD_FAILURE () ADD_FAILURE() << "test failure message"; ADD_FAILURE () आपके परीक्षण को विफल के रूप में चिह्नित करता है और आपके संदेश को आउटपुट करता है। यह कॉलिंग फ़ंक्शन से वापस नहीं आता है और मैक्रो की EXPECT_ श्रृंखला के साथ निष्पादन प्रवाह जारी रहता है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.