들어가며
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 Creator에서 C++ Library Project를 생성해 DLL 형태의 라이브러리를 만들었다.

#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을 찾지 못해 발생하는 문제이다.

이 문제는 과거에 겪었던 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 재실행을 통해 적용시켜야 한다.


회고
처음에는 빌드는 되는데 실행만 안 되는 증상을 보고 엄한 곳에서 헤맸다.
다행히 하나씩 확인해 보니, 이전에 겪었던 DLL 로드와 동일한 버그라는 것을 알 수 있었다.
이번엔 Qt6의 IPC 속도 체크를 하기 위해 gtest환경을 구성하면서,
프로젝트의 유닛테스트 환경구성과, 테스트 자동화를 중점으로 생각하며 진행했고
Qt Framework와 연계하면서 환경구성에 대해 깊이 생각해 볼 수 있었다.
추후 Code Coverage를 이용한 코드품질 향상과 Jenkins를 이용한 자동화를 공부해 보고 싶다.
'Qt' 카테고리의 다른 글
| Qt Event Loop 동작 원리 정리 ㅡ 타이머, 이벤트, 스레드 까지 (0) | 2026.01.23 |
|---|---|
| Qt IPC 성능 비교 실험기 ㅡ QSharedMemory, QLocalSocket, QTcpSocket, QRemoteObject (1) | 2026.01.19 |
| Qt 4 · Qt 5 · Qt 6 차이점 정리 — 레거시 컴파일 실무 경험 (0) | 2026.01.07 |
| Qt에서 시간 다루기: Unix Time, TimeZone, Embedded Device의 시간 전송 (0) | 2025.12.19 |
| Qt Signal/Slot과 Multi-Thread 동작 원리 - invokeMethod로 겪은 문제와 올바른 함수 설계 (0) | 2025.12.08 |