(Qt) QTest 프로젝트 생성하기

 

Qt에서 QTest project와 test classes를 생성하는 방법을 쓴 글입니다.


QT에서 TestCase 만들기

QT에서 testcase를 작성하려고 하니 공식 document는 꽤 불편해서 여러 사이트를 뒤져가며 삽질한 경험을 공유한다.

SubDir Project 생성

new project/Subdirs Project 생성한다.

생성할경우 바로 application project를 각자 프로젝트에 맞게 생성한다. 그후 add new/Other Project/Auto Test Project로 test code를 작성할 project를 생성한다.

TestCase 작성

QT에서 생성해주는 test project를 사용할 경우, 기본적으로 프로젝트 하나에 test code하나만 사용하게 돼있다.

아마 위대로 하셨으면 아래와 같이됐을 것 이다. build & qmake를 하고 실행하면 문제없이 돌아갈 것 이다.

#include <QtTest>

class TestMain : public QObject
{
    Q_OBJECT

public:
    TestMain();
    ~TestMain();

private slots:
    void test_case1();

};

TestMain::TestMain()
{ }

TestMain::~TestMain()
{ }

void TestMain::test_case1()
{
    QCOMPARE(true, true);
}

QTEST_APPLESS_MAIN(TestMain)

#include "tst_main.moc"

TestCase in several files

하지만 testcase를 작성하는 시점에서 testcode가 한 코드로 해결될 정도면 testcode를 작성하지도 않았을 것 이다.

하지만 QT의 공식 document에 따라 여러 테스트 코드 파일에 #include "tst_code.moc를 각각하게 되면, test가 진행되지 않는다.

그래서 test project에 main.cpp를 만들고 main.cpp에서 테스트를 각 테스트 별로 만든 class를 실행하면 된다. test class의 source/header 파일은 일반적인 cpp파일 작성하듯이 해주면 된다.

아래 이미지는 필자의 프로젝트 실제 test결과를 담은 내용이다. testcase code를 test class로 분리함으로서 각 class의 test결과를 보여준다. 리스트의 토글을 열어보면, 디버그 메세지/warning/compare result 등등이 있다.

test case result

main.cpp

#include <QTest>
#include <QApplication>

#include "tst_project.h"
#include "tst_main.h"


int main(int argc, char* argv[])
{
    QApplication a(argc, argv);
    {
        TestProject tp;
        QTest::qExec(&tp, argc, argv);
    }
    {
        TestMain tm;
        QTest::qExec(&tm, argc, argv);
    }
}

tst_main.cpp

#include "tst_main.h"

void TestMain::testcase1(void)
{
    QCOMPARE(true, true);
}

void TestMain::testInteger(void)
{
    QCOMPARE(1, 1);
}

tst_main.h

#ifndef TST_MAIN_H
#define TST_MAIN_H

#include <QtTest>
#include <QCoreApplication>

// add necessary includes here
#include "mainwindow.h"

class TestMain : public QObject
{
    Q_OBJECT
public:
    TestMain() {}
    ~TestMain(){}

private slots:
    void testcase1(void);
    void testInteger(void);
private:
    MainWindow mw;
};

#endif // TST_MAIN_H