5

我正在向 Qt 中的项目添加单元测试,并希望使用 QTestLib。我已经设置了测试并且它们运行良好。

问题是在项目中我们已经覆盖了 qDebug() 以输出到我们自己的日志文件。这在运行应用程序时效果很好,问题是当我测试类时,它有时会开始记录,然后将其发送到输出窗口。结果是一场彻底的灾难,几乎无法阅读,因为我们的日志与 QTest 输出混合在一起。

我想知道是否有办法抑制 qDebug() 输出,或者至少将其移动到其他地方。我已经尝试添加#define QT_NO_DEBUG_OUTPUT并使用qInstallMsgHandler(messageOutput);来重定向或阻止输出,但都没有任何效果。

4

2 回答 2

9

@Kuba 给出的解决方案在某些情况下有效,但在与QTest::qExec(&test,argc,argv)main 方法结合使用以运行多个测试时无效。在这种情况下,禁用 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()行,它将通过。

于 2012-06-20T21:19:56.707 回答
6
  1. 定义必须进入您的QT_NO_DEBUG_OUTPUT项目文件或生成文件,并且必须存在于您编译的每个文件中。然后您必须重新编译您的应用程序(当然不是 Qt 本身)。该宏在编译器命令行上的存在保证了第一次QDebug标头包含在任何代码中,qDebug将被重新定义为无操作。这就是这个宏的作用:如果包含头文件时qDebug 它存在<QtCore/qdebug.h>,它会禁用- 无论是您直接执行还是其他头文件间接执行。

  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";
}
于 2012-06-16T04:41:10.520 回答