5

Qt のプロジェクトに単体テストを追加しており、QTestLib を使用しようとしています。テストをセットアップしましたが、正常に動作しています。

問題は、プロジェクトで qDebug() をオーバーライドして、独自のログ ファイルに出力することです。これは、アプリの実行時にうまく機能します。問題は、クラスをテストしているときに、ログが開始され、出力ウィンドウに送信されることがあることです。その結果、ログが QTest の出力に混ざってしまうため、ほとんど読み取ることが不可能な完全な災害が発生します。

qDebug() 出力を抑制するか、少なくとも別の場所に移動する方法があるかどうか疑問に思っています。出力をリダイレクトまたは防止するために追加#define QT_NO_DEBUG_OUTPUTして使用しようとしqInstallMsgHandler(messageOutput);ましたが、どちらも効果がありませんでした。

4

2 に答える 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()行を削除すると表示されます。

于 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 に答える