본문 바로가기

Qt

Qt6 DLL 생성부터 gtest 유닛 테스트까지 ㅡ 프로젝트 구성 따라하기

들어가며

Qt 6 환경에서 DLL 프로젝트를 만들고

googleTest로 유닛 테스트를 구성해 보고 싶었지만,

테스트 환경을 구성하며 빌드는 되지만 테스트가 실행되지 않는 문제를 겪었다.

 

그 문제를 해결하는 과정을 바탕으로

유닛테스트 환경을 처음 구성하는 사람들이 따라 할 수 있도록 정리해 보려 한다.


테스트 환경 구성 목표

이번에 목표로 한 테스트 환경은 다음과 같다.

최종목표 : Qt 6.11 기반 기능 Unit Test
☐ Qt 6.11 Compiler 설치
☐ Qt 6 Framework로 기능 구현 후 DLL 형태로 빌드
☐ VsCode에서 googletest 관리
  ㄴ ☐ DLL 로드 후 유닛 테스트 실행

Qt 6 개발 환경 준비

먼저 Qt Maintenance Tool을 이용해 다음 환경을 설치했다.

  • Qt 6.11
  • MinGW 13.1.0 (64bit)

Qt Maintenance Tool

설치 후 Qt Creator에서 C++ Library Project를 생성해 DLL 형태의 라이브러리를 만들었다.

dll생성을 위한 Qt 프로젝트 설정

#include "mytestlib.h"
#include <QDebug>

MyTestLib::MyTestLib() {
    qDebug() << "created MyTestLib class.";
}

gtest에서 동작 여부를 확인하기 위해 간단한 Console 출력을 추가했고,

Release 빌드로 MyTestLib.dll 파일을 만들 수 있었다.


Vs Code + CMake + gtest 환경 구성

라이브러리 프로젝트 하위에 tests폴더를 생성하고, Vs Code에서 빌드하기 위한 CMake 환경을 설정한다.

VS Code 설정

MyTestLib\tests\.vscode\settings.json

{
  "cmake.generator": "MinGW Makefiles",

  "cmake.environment": {
    "PATH": "C:/Qt/Tools/mingw1310_64/bin;${env:PATH}"
  },

  "cmake.configureSettings": {
    "CMAKE_C_COMPILER": "C:/Qt/Tools/mingw1310_64/bin/gcc.exe",
    "CMAKE_CXX_COMPILER": "C:/Qt/Tools/mingw1310_64/bin/g++.exe",
    "CMAKE_PREFIX_PATH": "C:/Qt/6.11.0/mingw_64"
  }
}

 

 

CMakeLists.txt 구성

MyTestLib\tests\CMakeLists.txt

cmake_minimum_required(VERSION 3.14)
project(unittests)

set(CMAKE_AUTOMOC ON)

# Dependencies
find_package(Qt6 REQUIRED COMPONENTS Core Network)
add_subdirectory(C:/libs/googletest googletest-build)

# Imported Library
add_library(MyTestLib SHARED IMPORTED)
set(LIB_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../build/Desktop_Qt_6_11_0_MinGW_64_bit-Release/release")
set_target_properties(MyTestLib PROPERTIES
    IMPORTED_IMPLIB "${LIB_PATH}/libMyTestLib.a"
    IMPORTED_LOCATION "${LIB_PATH}/MyTestLib.dll"
)

# Executable
file(GLOB TEST_FILES CONFIGURE_DEPENDS "*_test.cpp")
add_executable(unittests ${TEST_FILES})

target_include_directories(unittests PRIVATE
    "${CMAKE_CURRENT_SOURCE_DIR}/.."
)
target_link_libraries(unittests PRIVATE
    Qt6::Core Qt6::Network
    gtest gtest_main
    MyTestLib
)

enable_testing()
add_test(NAME unittests COMMAND unittests)

 


간단한 테스트 코드 작성

간단한 테스트 코드를 빌드해 실행파일을 만들 수 있다.

MyTestLib\my_test.cpp

#include <gtest/gtest.h>
#include "mytestlib.h"

TEST(Test, FirstTest) {
    MyTestLib myTestLib;
}

빌드는 정상적으로 완료되지만, 테스트 실행 시 오류가 발생했다.


DLL 로드 오류

build폴더에서 생성된 프로그램을 실행하면

"Command executed now ... (Exit Code 1)" 에러를 볼 수 있는데,

실행 파일이 필요한 DLL을 찾지 못해 발생하는 문제이다.

Exit Code 1 Error

이 문제는 과거에 겪었던 QLibrary DLL 로드 실패와 비슷한 경우로,

unittests.exe 실행을 위해서는 Qt6 dll 들과 MyTestLib.dll 이 필요하다.

2025.11.11 - [Qt] - QLibrary DLL 로드 실패 원인 분석기 — ‘지정된 모듈을 찾을 수 없습니다’ 해결기

 

QLibrary DLL 로드 실패 원인 분석기 — ‘지정된 모듈을 찾을 수 없습니다’ 해결기

개발 중인 프로젝트에 QLibrary를 이용하며 기존에 없던 버그를 만났다.OPC UA Server를 실행하기 위해 "McdOpcUaServer.dll" 을 QLibrary를 통해 동적으로 로드하려 했다.QString fileName = SystemPath::driverLocation() +

prejudice.tistory.com

 


문제 해결 방법

나는 Qt6 DLL경로를 Windows 환경 변수(PATH)에 를 추가하고, tests\build 폴더에 MyTestLib.dll 복사해 문제를 해결했다.

* 환경변수에 등록하면, VsCode 재실행을 통해 적용시켜야 한다.

시스템 환경 변수에 Qt6 등록
테스트 성공 이미지


회고

처음에는 빌드는 되는데 실행만 안 되는 증상을 보고 엄한 곳에서 헤맸다.

다행히 하나씩 확인해 보니, 이전에 겪었던 DLL 로드와 동일한 버그라는 것을 알 수 있었다.

 

이번엔 Qt6의 IPC 속도 체크를 하기 위해 gtest환경을 구성하면서,

프로젝트의 유닛테스트 환경구성과, 테스트 자동화를 중점으로 생각하며 진행했고

Qt Framework와 연계하면서 환경구성에 대해 깊이 생각해 볼 수 있었다.

 

추후 Code Coverage를 이용한 코드품질 향상Jenkins를 이용한 자동화를 공부해 보고 싶다.