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下的visual studio 2010这个测试有问题。

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

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

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

如何抑制错误窗口?

4

2 回答 2

3

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

您可以替换 your Q_ASSERTwithassert或使用 aQtMsgHandler来抑制弹出窗口。

于 2012-04-25T18:15:15.500 回答
1

正如此线程中的其他用户(Fraser)所指出的,Googletest 不会捕获从 Qt for ex 抛出的断言。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 回答