2

gtestを使用してアサーションをテストしたいと思います。メソッドは次のようになります。

void aMethod()
{
    Q_ASSERT( 1 == geode.getNumDrawables());

    DoSomeOtherStuff
}

そして、テストは次のようになります。

TEST_F(aTestClassDeathTest, aTestName)
{
    ::testing::FLAGS_gtest_death test_style = "threadsafe";
    ASSERT_DEATH({ aMethod;}, "1 == geode.getNumDrawables");
}

このテストは、Linuxのgccで正常に機能します。

ただし、WindowsでのVisualStudio2010でのこのテストには問題があります。

テストを実行すると、エラーウィンドウが開きます。アサーションの失敗を示しています。ウィンドウを閉じると、すべてのテストが終了します。テストの失敗はありません。

gtestsは、アサーションの失敗を引き起こす新しいプロセスを開始し、プロセスの出力を評価すると思います。これは機能し、テストに合格します。

ただし、Visual Studioが新しいプロセスが失敗したことに気付くと、エラーウィンドウが作成されます。

エラーウィンドウを抑制するにはどうすればよいですか?

4

2 に答える 2

3

ポップアップウィンドウは、gtestではなくQtによるものです。Q_ASSERTマクロはCRTデバッグウィンドウを呼び出しています。

をに置き換えるか、Q_ASSERTassert使用しQtMsgHandlerてポップアップを抑制することができます。

于 2012-04-25T18:15:15.500 に答える
1

このスレッドで他のユーザー(Fraser)が指摘しているように、GoogletestはQtからスローされたアサーションをキャッチしません。Q_ASSERTまたはQ_ASSERT_X。つまり、ユーザーはQtアプリケーションから表示されるUIダイアログでアクションを実行する必要があります。

QtMsgHandlerが助けになります。この問題を回避する方法は次のとおりです。

以下に示すように関数を定義します。

void myMessageOutput(QtMsgType type, const char *msg)
 {
     switch (type) 
     {
         case QtDebugMsg:
             fprintf(stdout, "Debug: %s\n", msg); // you can also use stderr if you want
             break;
         case QtWarningMsg:
             fprintf(stdout, "Warning: %s\n", msg);
             break;
         case QtCriticalMsg:
             fprintf(stdout, "Critical: %s\n", msg);
             break;
         case QtFatalMsg:
             fprintf(stdout, "Fatal: %s\n", msg);
             abort();
     }
 }

アサーションを期待しているGoogletestアプリケーションでは、次の方法で呼び出します。

// Redirect all messages generated from Qt to stdout
qInstallMsgHandler(myMessageOutput);
// Call death testcase
EXPECT_DEATH(call_causing_assertion(),"");
// Restore the default message handler
qInstallMsgHandler(0);

次の方法で呼び出しを行って、テストアプリケーションからのすべてのQtアサーションダイアログを抑制することもできます。

int main(int argc, char **argv)
{
 qInstallMsgHandler(myMessageOutput);
 //QApplication app(argc, argv);

 testing::InitGoogleTest(&argc, argv);
 return RUN_ALL_TESTS();

 //...
 //return app.exec();
}
于 2012-07-31T10:33:47.023 に答える