首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用QTestLib时抑制qDebug

在使用QTestLib时抑制qDebug
EN

Stack Overflow用户
提问于 2012-06-16 05:30:34
回答 2查看 3.6K关注 0票数 5

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-16 12:41:11

  1. QT_NO_DEBUG_OUTPUT定义必须进入您的项目文件或生成文件,并且必须存在于您编译的每个文件中。然后你必须重新编译你的应用程序(当然不是Qt本身)。这个宏出现在编译器的命令行上,可以保证在任何代码第一次包含QDebug头时,qDebug将被重新定义为无操作。这就是这个宏的作用:当包含<QtCore/qdebug.h>标头时,如果qDebug存在,它将禁用它--无论是直接由您还是由其他标头间接包含。使用qInstallMsgHandler
  2. 在抑制调试输出方面肯定有效。

下面是一个自包含的示例。

代码语言:javascript
复制
#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";
}
票数 6
EN

Stack Overflow用户

发布于 2012-06-21 05:19:57

@Kuba给出的解决方案在某些情况下是有效的,但当在main方法中与QTest::qExec(&test,argc,argv)一起使用来运行许多测试时就不起作用了。在这种情况下,禁用(我发现的) qDebug()输出的唯一方法是让void initTestCase()插槽中的每个测试类注册一个新的消息处理程序。

例如

代码语言:javascript
复制
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。要防止出现这种情况,必须显式禁用每个测试类中的输出

代码语言:javascript
复制
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()行就可以了。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11058456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档