2014-12-03 3 views
1

그래서 메시지를 coutcerr에 인쇄하는 클래스가 있습니다. 슬프게도, 로깅을 사용하도록 리팩토링하는 것은 문제가되지 않습니다. 내 테스트에서는 described in this answer처럼 coutcerr을 모두 캡처하려고합니다. 테스트가 성공할 경우, 실제로 인쇄되는 것을 신경 쓰지 않습니다. 그러나 테스트가 실패하면 출력을보고 싶습니다.Gtest : 출력을 캡처하지만 실패 할 때 인쇄하십시오.

TEST(ook, eek) 
{ 
    // Capture cout. 
    std::stringstream buffer; 
    std::streambuf *sbuf = std::cout.rdbuf(); 
    std::cout.rdbuf(buffer.rdbuf()); 

    // Do test things: 
    auto ret = my_weird_function(some, weird, parameters); 
    EXPECT_TRUE(ret); 

    // Revert the capture. 
    std::cout.rdbuf(sbuf); 

    // Only print if things have gone wrong... 
    if (ERROR) 
    { 
    std::cout << buffer.str() << std::endl; 
    } 
} 

는 분명히, 나는 고정이의 설치/해체 방법을 사용할 수 있지만 여전히 오류 검사를 잃었 : 그럼, 내가 원하는 유사한 무언가이다.

답변

2

사용자 지정 테스트 수신기를 구현하여 사용해야합니다. 내 맞춤 리스너 here을 어떻게 구현했는지 살펴볼 수 있습니다.

귀하의 경우에는

, 그냥 오류 메시지를 인쇄 할 경우, 아무것도 다른,이 같은 무언가 작동합니다 :

#include "gtest/gtest.h" 

class MyTestPrinter : public ::testing::EmptyTestEventListener 
{ 

    virtual void OnTestEnd(const ::testing::TestInfo& test_info) 
    { 
     if (test_info.result()->Failed()) 
     { 
      std::cout << test_info.test_case_name() << " failed " << test_info.name() << std::endl; 
     } 
    } 
}; 
+0

매우 좋습니다! 이것은 내가 뭔가를 생각해내는 것을 허용했다. – Sardathrion

+1

@Sardathrion 또한 다음을 참조하십시오. https://code.google.com/p/googletest/wiki/V1_6_AdvancedGuide#Defining_Event_Listeners –

2

이 내가 BЈовићanswer를 사용 해낸 것입니다.

class TestOOK : public ::testing::Test 
{ 
    protected: 

     virtual void SetUp() 
     { 
      buffer.str(std::string()); // clears the buffer. 
      sbuf = std::cout.rdbuf(); 
      std::cout.rdbuf(buffer.rdbuf()); 
     } 

     virtual void TearDown() 
     { 
      std::cout.rdbuf(sbuf); 
      const ::testing::TestInfo* const test_info = 
       ::testing::UnitTest::GetInstance()->current_test_info(); 
      if (test_info->result()->Failed()) 
      { 
       std::cout << std::endl << "Captured output from " 
        << test_info->test_case_name() 
        << " is:" 
        << std::endl 
        << buffer.str() 
        << std::endl; 
      } 
     } 

     std::stringstream buffer; 
     std::streambuf* sbuf; 
}; 
관련 문제