Googletest - DeathTest不会从Qt应用程序中捕获断言,例如Q_ASSERT等。

时间:2012-04-25 14:16:24

标签: c++ qt googletest googlemock

我想用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下的visual studio 2010中,这个测试存在问题。

当我运行测试时,会打开一个错误窗口。它显示断言失败。当我关闭窗口时,所有测试都完成。没有测试失败。

我认为gtests启动一个新进程,导致断言失败并评估进程输出。这有效,测试通过。

但是当visual studio注意到新进程失败时,它会创建错误窗口。

如何抑制错误窗口?

2 个答案:

答案 0 :(得分:2)

弹出窗口是由Qt而不是gtest引起的。 Q_ASSERT宏正在调用CRT调试窗口。

您可以将Q_ASSERT替换为assert,也可以使用QtMsgHandler取消弹出广告。

答案 1 :(得分: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();
}