【发布时间】:2010-04-30 18:55:05
【问题描述】:
我的 Qt 应用程序使用 Q_ASSERT_X,它调用 qFatal(),它(默认情况下)中止应用程序。这对应用程序来说很好,但我想在对应用程序进行单元测试时抑制这种行为。 (我正在使用Google Test Framework。)我在一个单独的项目中进行单元测试,静态链接到我正在测试的类。 qFatal() 的documentation 内容如下:
调用消息处理程序 致命消息消息。如果没有消息 处理程序已安装, 消息被打印到标准错误。在下面 Windows,消息被发送到 调试器。
如果您使用的是默认消息 处理程序此函数将中止 Unix 系统创建核心转储。在 Windows,对于调试版本,这个 函数将报告 _CRT_ERROR 使您能够将调试器连接到 应用程序。
...
为了在运行时抑制输出, 安装您自己的消息处理程序 qInstallMsgHandler()。
这是我的 main.cpp 文件:
#include <gtest/gtest.h>
#include <QApplication>
void testMessageOutput(QtMsgType type, const char *msg) {
switch (type) {
case QtDebugMsg:
fprintf(stderr, "Debug: %s\n", msg);
break;
case QtWarningMsg:
fprintf(stderr, "Warning: %s\n", msg);
break;
case QtCriticalMsg:
fprintf(stderr, "Critical: %s\n", msg);
break;
case QtFatalMsg:
fprintf(stderr, "My Fatal: %s\n", msg);
break;
}
}
int main(int argc, char **argv)
{
qInstallMsgHandler(testMessageOutput);
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
但我的应用程序仍在断言处停止。我可以看出我的自定义处理程序正在被调用,因为运行我的测试时的输出是:
我的致命:ASSERT 失败 MyClass::doSomething: "doSomething()", 文件 myclass.cpp,第 21 行程序 意外结束了。
我该怎么做才能让我的测试在断言失败时继续运行?
【问题讨论】:
标签: unit-testing qt googletest