개발도구/기타

[QT] Qt에서 구글 Test 사용하기

쓴웃음 2021. 6. 19. 01:32

개요

Qt를 기반 프로젝트의 진행을 위한 개발환경 구축 과정을 정리하였습니다.

환경설정 (설치)

참고 : Ubuntu 20.04에서 진행하였습니다.

Qt5

다음 명령을 이용하여 간단히 설치할 수 있습니다.

$ sudo apt-get update
$ sudo apt-get install build-essential
$ sudo apt-get install qt5-default
$ sudo apt-get install qtcreator

# 문서 및 예제 설치
$ sudo apt-get install qt5-doc
$ sudo apt-get install qt5-doc-html qtbase5-doc-html
$ sudo apt-get install qtbase5-example

$ qmake --version # 설치 확인
QMake version 3.1
Using Qt version 5.12.8 in /usr/lib/x86_64-linux-gnu

Qt4

기존 legacy 프로젝트를 빌드 및 시험하기 위해 Qt4 도 설치하였습니다.

$ sudo add-apt-repository ppa:rock-core/qt4
$ sudo apt update

$ sudo apt install libqt4-declarative qt4-dev-tools qt4-qmake libqtwebkit4
$ sudo apt install qt4-default 
$ qmake-qt4 --version 

make 파일 생성

$ qmake-qt4
QMake version 2.01a
Using Qt verson 4.8.7 in /usr/lib/x86_64-linux-gnu

update-alternative를 사용하여 필요에 따라 버전을 선택할 수 있도록 설정하도록 합니다.

Google Test

$ sudo apt update -y
$ sudo apt install build-essential wget cmake
$ cd ~
wget https://github.com/google/googletest/archive/refs/tags/release-1.10.0.tar.gz
tar -xf release-1.10.0.tar.gz 
cd googletest-release-1.10.0/
cmake .
make
sudo make install
sudo ldconfig

동작확인

Hello World

설치 후 Qt의 동작 확인을 위하여 Hello World프로그램을 작성합니다.

Qt Creator를 실행한 후 새로운 프로젝트를 생성합니다.

간단히 Hello World를 출력할 것이므로 프로젝트 종류는 [Qt Console Application]을 선택합니다.

프로젝트명을 정한 후, Next를 연타합니다.

생성된 main.cpp를 다음과 같이 수정합니다.

#include <QApplication>
#include <iostream>

int main(int argc, char *argv[]) {

    QApplication app(argc, argv);

    std::cout << "Hello, world!" << std::endl;
    std::cout << "Qt Version: " << QT_VERSION_STR << std::endl;

    return app.exec();
}

빌드 후 실행합니다.

※ 만약 g++ 4.8 이하의 버전을 사용한다면 c++11 옵션 활성화를 위하여 프로젝트 파일 (.pro)에 CONFIG += c++11을 추가합니다.

※ 만약 QtCreator에서 컴파일이 되지 않는다면, [메뉴][Help][About Plugin]C++ ClangCodeModel을 체크 해제합니다.

단위 시험 설정하기 (gtest)

프로젝트 생성

subdir project 생성

Choose a template: [Ohter Project][Subdirs Project]

원하는 프로젝트 명을 입력합니다. 저는 MyProject로 생성하였습니다.

테스트 대상 project 생성

Non-Qt ProjectPlain C++ Application을 선택합니다.

이름은 App으로 입력하였습니다.

다음 소스코드를 추가합니다.

/* Addition.h */
#ifndef ADDITION_H
#define ADDITION_H

class Addition {
public:
    static int twoValues(const int x, const int y);
};

#endif // ADDITION_H
/* Addition.cpp */
#include "Addition.h"

int Addition::twoValues(const int x, const int y) {
    return x + y;
}
/* Multiply.h */
#ifndef MULTIPLY_H
#define MULTIPLY_H

class Multiply {
public:
    static int twoValues(const int x, const int y);
};

#endif // MULTIPLY_H
/* Multiply.cpp */
#include "Multiply.h"

int Multiply::twoValues(const int x, const int y)
{
    return x * y;
}
/* main.cpp */
#include <iostream>
#include <Addition.h>
#include <Multiply.h>

int main()
{
    int x{4}, y{5};

    int z1 = Addition::twoValues(x,y);
    int z2 = Multiply::twoValues(x,y);

    std::cout << "Addition Result: " << z1 << std::endl;
    std::cout << "Multiply Result: " << z2 << std::endl;

    return 0;
}

빌드 후, 실행하면 다음과 같이 결과를 얻게 됩니다.

Addition Result: 9
Multiply Result: 20

테스트 Subproject

Non-Qt ProjectPlain C++ Application을 선택합니다.

이름은 Test로 입력했습니다.

다음과 같이 test case와 test runner를 작성합니다.

/* main.cpp */
#include <limits.h>
#include <gtest/gtest.h>

int main(int argc, char *argv[])
{
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}
/* Addition_Test.cpp */
#include <limits.h>
#include "gtest/gtest.h"
#include "Addition.h"

class AdditionTest : public ::testing::Test {
 protected:
  virtual void SetUp() {
  }

  virtual void TearDown() {
    // Code here will be called immediately after each test
    // (right before the destructor).
  }
};

TEST_F(AdditionTest,twoValues){
    const int x = 4;
    const int y = 5;
    Addition addition;
    EXPECT_EQ(9,addition.twoValues(x,y));
    EXPECT_EQ(5,addition.twoValues(2,3));
}
/* Multiply_Test.cpp */
#include <limits.h>
#include "gtest/gtest.h"
#include "Multiply.h"

class MultiplyTest : public ::testing::Test {
 protected:
  virtual void SetUp() {
  }

  virtual void TearDown() {
  }
};

TEST_F(MultiplyTest,twoValues){
    const int x = 4;
    const int y = 5;
    Multiply multiply;
    EXPECT_EQ(20,multiply.twoValues(x,y));
    EXPECT_EQ(6,multiply.twoValues(2,3));
}
Test.pro 파일 수정

생성한 'Test' 프로젝트를 빌드하기 위해 외부 의존성(App 프로젝트와 google test라이브러리)을 추가합니다.

TEMPLATE = app
CONFIG += console c++11
CONFIG -= app_bundle
CONFIG += thread
CONFIG -= qt

INCLUDEPATH += \
            ../App \
            /usr/local/include/gtest \
            /usr/local/include/gmock

# gtest 를 사용하는데 필요한 함수를 추가합니다.
LIBS += -lgtest -L/usr/local/lib
LIBS += -lgmock -L/usr/local/lib
LIBS += -pthread

SOURCES += \
        Addition_Test.cpp \
        Multiply_Test.cpp \
        main.cpp \
        ../App/Addition.cpp \
        ../App/Multiply.cpp

SUBDIRS += ../App

HEADERS += \
        Addition_Test.h \
        Multiply_Test.h

보충

빌드 후, 단위 시험을 실행하도록 설정하기

[Projects][Project Settings][Testing] → 을 Custom으로 변경한 후, Automatical run tests after build 항목을 All 또는 Selected를 선택합니다.

결론

최종 파일 및 구조는 다음과 같습니다.

.
├── App
│   ├── Addition.cpp
│   ├── Addition.h
│   ├── App.pro
│   ├── main.cpp
│   ├── Multiply.cpp
│   └── Multiply.h
├── Test
│   ├── Addition_Test.cpp
│   ├── main.cpp
│   ├── Multiply_Test.cpp
│   └── Test.pro
├── MyProject.pro
└── MyProject.pro.user

참고