我在Qt中为项目添加单元测试,我希望使用QTestLib。我已经设置了测试,它们运行正常。
问题是在项目中我们覆盖了qDebug()以输出到我们自己的日志文件。这在运行应用程序时效果很好,问题是当我测试类时,它有时会开始记录,然后发送到输出窗口。结果是一个完全的灾难,几乎无法读取,因为我们的日志与QTest输出混合在一起。
我想知道是否有办法抑制qDebug()输出,或者至少将其移动到其他地方。我尝试添加#define QT_NO_DEBUG_OUTPUT
并使用qInstallMsgHandler(messageOutput);
来重定向或阻止输出,但都没有任何效果。
答案 0 :(得分:8)
@Kuba提供的解决方案在某些情况下有效,但在主方法中与QTest::qExec(&test,argc,argv)
结合使用时不能运行多个测试。在这种情况下,禁用qDebug()输出(我发现)的唯一方法是为其void initTestCase()
槽中的每个测试类注册一个新的消息处理程序。
例如
void noMessageOutput(QtMsgType, const char *)
{}
int main(int argc,char* argv[])
{
qInstallMsgHandler(noMessageOutput);
tst_Class1 t1;
tst_Class2 t2;
QTest::qExec(&t1,argc,argv);
QTest::qExec(&t2,argc,argv);
}
将显示调试输出tst_Class1,Class1,tst_Class2和Class2。为了防止这种情况,您必须在每个测试类中明确禁用输出
class tst_Class1
{
//class stuff
private slots:
void initTestCase();
//test cases
};
void tst_Class1::initTestCase()
{
qInstallMsgHandler(noMessageOutput);
}
class tst_Class2
{
//class stuff
private slots:
void initTestCase();
//test cases
};
void tst_Class2::initTestCase()
{
qInstallMsgHandler(noMessageOutput);
}
如果您希望从类的子集中看到调试输出,请删除qInstallMsgHandler()
行,它将会通过。
答案 1 :(得分:6)
QT_NO_DEBUG_OUTPUT
定义必须进入项目文件或makefile,并且必须存在于您编译的每个文件中。然后,您必须重新编译您的应用程序(当然不是Qt本身)。此宏在编译器命令行中的存在可确保任何代码都包含第一次QDebug
标头,qDebug
将重新定义为no-op。这就是这个宏所做的事情:当qDebug
标头被包含时,它会禁用<QtCore/qdebug.h>
(如果它存在) - 无论是直接由你还是间接地由其他标题。
使用qInstallMsgHandler
肯定可以抑制调试输出。
以下是一个独立的示例。
#if 0
// Enabling this section disables all debug output from non-Qt code.
#define QT_NO_DEBUG_OUTPUT
#endif
#include <QtCore/QDebug>
void noMessageOutput(QtMsgType, const char *)
{}
int main(int argc, char *argv[])
{
qDebug() << "I'm shown";
qInstallMsgHandler(noMessageOutput);
qDebug() << "I'm hidden";
}