web-dev-qa-db-ja.com

Google C ++ Testing Frameworkでカスタムメッセージを送信する方法は?

コードの単体テストに Google C++ Testing Framework を使用します。 Eclipse CDT with C++ Unit Testing Module を出力分析に使用します。

以前は CppUnit マクロファミリを使用していました CPPUNIT * _MESSAGE これは次のように呼び出すことができます:

CPPUNIT_ASSERT_EQUAL_MESSAGE("message",EXPECTED_VALUE,ACTUAL_VALUE)

また、テスト出力にカスタムメッセージを送信できます。

Googleテスト出力にカスタムテキストを含める方法はありますか?

(できれば、Google Testを使用した自動化された単体テスト用に既存のプログラムによって読み取られるデータへのメッセージを含めることができる方法。)

62

Gtestマクロは、テストが失敗したときに診断メッセージを出力するためのストリームを返します。

EXPECT_TRUE(false) << "diagnostic message";
123
user2093113

Gtestの現在のバージョンでは、きれいに実行する方法はありません。コードを見て、fail testの場合、テキスト出力(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;
}

出力:

Example output

コード:

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()
57
Mark Lakata

非常にシンプルであり、それを行うためのハックな方法があります(内部クラスに飛び込んだり、新しいカスタムクラスを作成したりする必要はありません)。

マクロを定義するだけです:

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

そして、GTEST_COUT(テストでcoutのように):

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

そして、あなたはそのような結果を見るでしょう:

enter image description here

功績は @ Martin Nowak にあります。

8
Just Shadow

マーク・ラカタの答えを参照してください、ここに私の方法があります:

手順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_ */

ステップ2:gtestでGOUTを使用

使用法:

#include "gtest_cout.h"

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

以下を定義する必要があります。

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

} logout;

これを使用して:

logout.info() << "test: " << "log" << std::endl;
2
허영주