2012-06-15 4 views
4

Qt 프로젝트에서 단위 테스트를 추가하고 QTestLib를 사용하려고합니다. 테스트를 설정하고 잘 실행 중입니다.QTestLib을 사용할 때 qDebug를 표시하지 않습니다.

문제는 프로젝트에서 qDebug()를 재정의하여 자체 로그 파일로 출력한다는 것입니다. 이 응용 프로그램을 실행할 때 위대한 작품, 문제는 내가 클래스를 테스트 할 때, 그것은 때때로 출력 창으로 전송되는 로깅을 시작합니다. 결과적으로 로그가 QTest 출력과 섞여서 읽을 수없는 완벽한 재난이 발생합니다.

qDebug() 출력을 억제하거나 다른 곳으로 이동하는 방법이 있는지 궁금합니다. #define QT_NO_DEBUG_OUTPUT을 추가하고 qInstallMsgHandler(messageOutput);을 사용하여 출력을 리디렉션하거나 출력하지 못하도록 시도했지만 어느 것도 영향을 미치지 않았습니다.

답변

6
  1. QT_NO_DEBUG_OUTPUT 프로젝트 파일이나 메이크로 이동해야 정의하고 컴파일 모든 파일에 있어야합니다. 그런 다음 응용 프로그램을 다시 컴파일해야합니다 (물론 Qt 자체는 아닙니다). 이 매크로는 컴파일러의 명령 줄에 있으므로 어떤 코드에서도 처음으로 QDebug 헤더가 포함되어 있으므로 qDebug은 no-op로 재정의됩니다. 이 매크로는 다음과 같습니다. <QtCore/qdebug.h> 헤더가 포함될 때 헤더가 포함될 때 또는 간접적으로의 다른 헤더가 포함 된 경우 qDebug이 사용 중지됩니다.

  2. qInstallMsgHandler을 사용하면 확실히 디버그 출력을 억제합니다.

다음은 자체 포함 된 예입니다. @Kuba 주어진

#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"; 
} 
+2

감사합니다. noMessageOutput을 등록하는 유일한 방법은 각 테스트 케이스의 initTestCase() 슬롯에서 수행하는 것이었지만 지금은 작동하고 있습니다. – Adam

8

용액을 경우에 따라 동작하지만, 메인 QTest::qExec(&test,argc,argv) 방법과 함께 사용하지 않을 때 테스트들을 실행. 이 경우 qDebug() 출력을 비활성화하는 유일한 방법은 각 메시지 클래스의 void initTestCase() 슬롯에 새 메시지 처리기를 등록하는 것입니다. 디버그 출력 tst_Class1, 클래스 1, tst_Class2 및 Class2의 표시됩니다 예를

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);  
} 

를 들어

. 당신이 클래스의 하위 집합에서 디버그 출력을보고 싶은 경우이를 방지하기 위해 명시 적으로 테스트 클래스

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() 줄을 제거하고 통해 올 것이다.

관련 문제