Google C ++ Testing Frameworkでカスタムメッセージを送信するにはどうすればよいですか?


83

コードの単体テストにはGoogleC ++テストフレームワークを使用しています。私が使用してC ++ユニットはモジュールのテストでのEclipse CDTを出力分析のため。

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

CPPUNIT_ASSERT_EQUAL_MESSAGE("message",EXPECTED_VALUE,ACTUAL_VALUE)

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

グーグルテスト出力にいくつかのカスタムテキストを含める方法はありますか?

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

回答:


160

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

EXPECT_TRUE(false) << "diagnostic message";

@ErikAronestyソースを調べて、そのデータとインターフェイスする簡単な方法があるかどうかを確認しましたか?
kayleeFrye_onDeck 2016

2
結果に関係なくテキストを印刷する必要がある場合は、stdoutに書き込むだけです。しかし、これは通常、非常にノイズの多いテストになり、操作が困難になります。
Audrius Meskauskas 2018

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()

おかげで、これは正しい解決策です、私見。しかし\n、クラス内のPRINTFにを追加することを提案できますか?std::coutこれは、のようにTEST_COUTで行を結合できないため、ユーザーに自分のを追加させることは無意味\nです。ともあれ、ありがとう!
HappyCactus 2017

1
残念ながら、このアプローチは最新バージョンのGoogle Testでは機能しtesting::internal::ColoredPrintfなくなりました
AntonK20年

17

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

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

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

テストでGTEST_COUT(のようにcout)使用します:

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

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

ここに画像の説明を入力してください

クレジットは@MartinNowakの発見にあります。


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

ステップ2: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.