我想用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注意到新进程失败时,它会创建错误窗口。
如何抑制错误窗口?
答案 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();
}