2012-04-25 55 views
1

我想用gtest来测试一个断言。 的方法是这样的:Googletest - DeathTest没有捕获Qt应用程序中的断言,如Q_ASSERT等。

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

    DoSomeOtherStuff 
} 

并且测试是这样的:在linux下

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

这个测试工作正常用gcc。

但在Windows下的visual studio 2010中进行此测试存在问题。

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

我认为gtests开始一个新的过程,导致断言失败并评估过程输出。这工作和测试通过。

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

我该如何抑制错误窗口?

回答

2

弹出窗口是由于Qt,而不是gtest。 Q_ASSERT宏正在调用CRT调试窗口。

您可以将Q_ASSERT替换为assert,也可以使用QtMsgHandler来取消弹出窗口。

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(); 
} 
相关问题