c++ - 使用 QTestLib 时抑制 qDebug

标签 c++ qt unit-testing

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

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

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

最佳答案

@Kuba 给出的解决方案在某些情况下有效,但在 main 方法中与 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() 行,它将通过。

关于c++ - 使用 QTestLib 时抑制 qDebug,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11058456/

相关文章:

c++ - 帮助理解生成的部分汇编代码

qt - 在 QTreeView 中显示来自 QAbstractTableModel 的数据

c++ - QT退出不调用MainWindow析构函数

java - 如何正确使用 DoThrow()

python - 在同一个python函数中模拟两个具有不同返回值的redis hget

c++ - 如何忽略C++中的某些输入行?

c++ - 是否有任何免费程序可以制作从头文件中提取的文件依赖关系图?

c++ - 在 Mac 上构建 opencv 2.4.6 - Mavericks

c++ - Qt4 C++ : QString variable usage from multiple threads crashes

java - 如何在 Play 框架单元测试中加载不同的插件?