Google C ++ 테스트 프레임 워크에서 사용자 지정 메시지를 보내는 방법은 무엇입니까?


83

내 코드의 단위 테스트를 위해 Google C ++ 테스트 프레임 워크 를 사용 합니다. 출력 분석을 위해 C ++ 단위 테스트 모듈과 함께 Eclipse CDT를 사용 합니다.

이전에는 CppUnit 을 사용 했는데 다음과 같이 호출 할 수있는 매크로 계열 CPPUNIT * _MESSAGE 가 있습니다.

CPPUNIT_ASSERT_EQUAL_MESSAGE("message",EXPECTED_VALUE,ACTUAL_VALUE)

그리고 테스트 출력에 사용자 지정 메시지를 보낼 수 있습니다.

Google 테스트 출력에 일부 사용자 지정 텍스트를 포함하는 방법이 있습니까?

(구글 테스트를 사용하는 자동화 된 단위 테스트를 위해 기존 프로그램에서 읽은 데이터에 대한 메시지를 포함 할 수있는 방법이 좋습니다.)

답변:


160

gtest 매크로는 테스트가 실패 할 때 진단 메시지를 출력하기위한 스트림을 반환합니다.

EXPECT_TRUE(false) << "diagnostic message";

@ErikAronesty 해당 데이터와 인터페이스하는 쉬운 방법이 있는지 확인하기 위해 소스를 살펴 보셨습니까?
kayleeFrye_onDeck

2
결과에 관계없이 텍스트를 인쇄해야하는 경우 stdout에 작성하면됩니다. 그러나 이것은 일반적으로 작업하기 어려운 매우 시끄러운 테스트 결과입니다.
Audrius Meskauskas

FAIL () << "진단 메시지"; 동일한 방식으로 작동하지만 모든 EXPECT_X () 매크로에 대해 수행하는 실제 값, 예상 값 등에 대해 알려주지 않으므로 생성 된 출력을 몇 줄로 줄입니다. 출력 길이를 조금 줄이려는 경우를 대비하여.
BallisticTomato

61

현재 버전의 gtest에서는 깔끔하게 수행 할 수있는 방법이 없습니다. 코드를 살펴본 결과 테스트에 실패 하면 텍스트 출력 (gtest "Messages"로 래핑 됨)이 표시됩니다 .

그러나 어느 시점에서 gtest가 printf화면에 표시 되기 시작 하고 그 이상의 수준을 활용하여 플랫폼에 독립적 인 색상을 얻을 수 있습니다.

원하는 작업을 수행 할 수있는 해킹 된 매크로가 있습니다. 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. 어쨌든 감사합니다!
HappyCactus

1
testing::internal::ColoredPrintf
안타깝게도이

17

매우 간단 (내부 클래스로 다이빙의 필요없이 또는 새로운 사용자 정의 클래스를 만드는) 그 일을 및 해키 방법.

매크로를 정의하면됩니다.

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

테스트에서 GTEST_COUT(와 같이 cout) 사용 하십시오.

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

그리고 다음과 같은 결과를 볼 수 있습니다.

여기에 이미지 설명 입력

그의 발견에 대한 크레딧은 @Martin Nowak 에 있습니다.


5

Mark Lakata의 답변을 참조하십시오.

1 단계 : 헤더 파일을 만듭니다. 예 : 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 : GOUTgtest에서 사용

용법:

#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 () FAIL() << "test failure message"; FAIL ()은 테스트를 실패로 표시하고 메시지를 출력 한 다음 함수에서 반환합니다. 따라서 void를 반환하는 함수에서만 사용할 수 있습니다.
  • ADD_FAILURE () ADD_FAILURE() << "test failure message"; ADD_FAILURE ()는 테스트를 실패로 표시하고 메시지를 출력합니다. 호출 함수에서 반환되지 않으며 EXPECT_ 시리즈 매크로와 마찬가지로 실행 흐름이 계속됩니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.