在使用QTestLib时,如何抑制qDebug输出?

5
我正在为Qt项目添加单元测试,并希望使用QTestLib。我已经设置了测试并且它们运行良好。
问题在于,在项目中,我们重写了qDebug()以输出到我们自己的日志文件。当运行应用程序时,这非常有效,但问题在于当我测试类时,有时会开始记录,然后将其发送到输出窗口。结果是完全混乱,几乎无法阅读,因为我们的日志与QTest的输出混在一起。
我想知道是否有办法抑制qDebug()的输出,或者至少将其移动到其他地方。我尝试添加#define QT_NO_DEBUG_OUTPUT 和使用 qInstallMsgHandler(messageOutput); 来重定向或防止输出 ,但两者都没有任何效果。
2个回答

9

@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()行,这样就可以看到输出了。


6
  1. QT_NO_DEBUG_OUTPUT定义放入您的项目文件或makefile中,并且必须存在于您编译的每个文件中。然后,您必须重新编译您的应用程序(当然不是Qt本身)。编译器命令行上存在此宏可保证任何代码首次包含QDebug头文件时,qDebug将被重新定义为无操作。这就是该宏的作用:当直接或间接地由其他头文件包含时,禁用qDebug(如果存在)。

  2. 使用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";
}

2
谢谢。我发现注册noMessageOutput的唯一方法是在每个测试用例的initTestCase()槽中进行,但现在它已经可以工作了。 - Adam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接