2012-04-25 7 views
1

gtestを使ってアサーションをテストします。 方法は次のようになります。Googletest - DeathTestはQ_ASSERTなどのQtアプリケーションからのアサーションをキャッチしません。

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で正常に動作します。

しかし、Visual Studio 2010のWindowsではこのテストに問題があります。

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

私はgtestsがアサーションの失敗を引き起こし、プロセスの出力を評価する新しいプロセスを開始すると思います。これは動作し、テストパスします。

しかし、新しいプロセスが失敗したことをVisual Studioに通知すると、エラーウィンドウが作成されます。

どのようにエラーウィンドウを抑制できますか?

答えて

2

ポップアップウィンドウはgtestではなくQtが原因です。 Q_ASSERTマクロがCRTデバッグウィンドウを呼び出しています。

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

1

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

QtMsgHandlerが救助に来ます。ここであなたはこの問題を回避する方法です。

、以下のように関数を定義:

// 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); 

あなたはまた、抑制するために、次のように電話をかけることができます:あなたはアサーションが方法を以下にそれを呼び出す期待しているあなたのGoogletestアプリケーションで

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

をテストアプリケーションからのすべてのQtアサーションダイアログ:

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

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

//... 
//return app.exec(); 
} 
関連する問題