使用QTestLib时禁止qDebug

Ada*_*dam 5 c++ qt unit-testing

我在Qt中添加了单元测试,我希望使用QTestLib.我已经设置了测试,它们运行正常.

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

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

Ada*_*dam 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);     
}
Run Code Online (Sandbox Code Playgroud)

将显示调试输出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);
}
Run Code Online (Sandbox Code Playgroud)

如果您希望从类的子集中看到调试输出,则删除该qInstallMsgHandler()行,它将通过.


Rei*_*ica 6

  1. QT_NO_DEBUG_OUTPUT定义必须进入你的项目文件或makefile和必须存在于每一个编译文件.然后,您必须重新编译您的应用程序(当然不是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";
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢.我发现注册noMessageOutput的唯一方法是在每个测试用例的initTestCase()插槽中执行它,但我现在正在使用它 (2认同)