들어가기 전
정~말 오랜만에 글을 쓴다.
최근 사내 프로젝트에 Visual Studio 2017에 gtest을 사용하여 Unit Test 환경을 구축하였다.
10년 전쯤 외국 프로젝트를 하면서 gtest를 처음 접하고 잠깐 맛만 봤었음에도 되게 불편했던(환경구축 및 사용이 쉽지 않았던) 기억이 있었다. 결론부터 얘기하자면 지금도 너무 힘들게 구축을 했다. 개발 방식도 10년 전과 크게 다르지 않고, C++ 컴파일의 탈을 쓴 C 언어식 구현 방식의 탓도 있겠지만 java의 Unit Test 환경과 너무 비교가 되었다. java 개발 IDE는 코드를 생성하면 자동으로 테스트 코드가 생성되는데 VS에서는 직접 코딩을 해서 TC를 추가해야 한다. 이 차이 너무 갭이 크다 ㅠㅠ
참고 : 2023.01.10 - [개발/TDD] - TDD : Unit Test 환경 설정(IntelliJ + java + JUnit)
(IntelliJ 때도 eclipse와 비교가 되었었는데 IDE의 문제 일수도 있다.)
각설하고 정리할 수 있는 내용 위주로 정리를 해보고자 한다.
현재 Project에 Unit Test 프로젝트 추가
2017부터 gtest가 IDE에 내장되어 있어서 손쉽게 추가할 수 있다.
현재 '솔루션(혹은 프로젝트)'에서 '추가' -> 새 프로젝트 ->Visual C++ -> 테스트 -> Google Test 선택

Google test가 IDE 내에 없다면 아래 내용 확인
도구 -> 도구 및 기능 가져오기 에서 Test Adapter for Google Test 가 설치되어 있는지 확인필요!

'정적 라이브러리' 를 선택하면 Unit test를 위한 프로젝트 및 test.cpp 파일이 생성된다.

기본 생성 test 파일을 빌드하고 실행하면 정상적으로 테스트 코드가 실행이 된다.

프로젝트 코드로 Unit test 만들기
여기가 가장 힘들었던 부분이다. 소스를 가져오는 것에서부터 lib 참조까지 인내하며 수많은 에러를 해결해야 테스트 환경을 갖출 수 있게 된다.
h 파일 추가
속성 -> 구성 속성 -> C/C++ -> 일반 -> 추가 포함 디렉터리
: 여기에 추가되는 디렉토리는 unit test로 만드려고 하는 프로젝트의 경로를 가져다 쓰면 된다.

lib 추가
: h 파일들이 경로가 추가가 되었다면 참조할 lib와 경로를 추가해야 한다. 이것도 특별한 경로가 아닌 프로젝트가 참조하는 라이브러리 디렉터리를 지정해 주면 된다.
속성 -> 구성 속성 -> 링커 -> 일반 -> 추가 라이브러리 디렉터리
참고 : 대부분의 추가되는 폴더가 lib로 끝난다.

속성 -> 구성 속성 -> 링커 -> 입력 -> 추가 종속성
: 프로젝트 실행 시 참조하는 *.lib 들을 추가해 준다. (이것도 프로젝트에서 사용하는 lib를 추가하면 된다.)

트러블 슈팅
기본적으로는 잘되어야 활용도가 높을 텐데 일일이 정확하게 맞춰줘야 하는 부분은 확실히 좀 더 옛날 방식 같다고 느껴진다.
Unit Test가 응용프로그램인 경우
Unit Test 를 만들고 싶은 프로젝트의 속성 -> 구성 속성 -> 일반 -> 구성 형식 -> exe -> 정적 라이브러리(lib)로 변경
런타임 에러가 나는 경우

응용프로그램이 실행되기 위해 필요한 dll 파일들이 응용프로그램 실행파일(.exe)이 있는 곳에 모여 있다. 이 경우는 두 가지 방법이 있는데 본인은 방법 1로 해결을 했다. 방법 2는 구글링해서 찾은 내용이다.
방법 1) 해당 파일들을 C:\Windows\System32에 넣는다.
방법 2) 디버그 -> 옵션 -> 디버깅 -> 기호 -> 'Microsoft 기호 서버' 체크하고, '다음 디렉터리에 기호 캐시'에 dll을 다운로드(?)할 경로를 지정한다. (해보진 않았지만 다운로드 한다고 한다.)

LNK2038 에러
. 런타임 라이브러리가 맞지 않음
error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in program.obj
런타임 라이브러리가 맞지 않으면 서로 호환이 안되기에 띄우는 에러로
프로젝트의 속성 -> 구성 속성 -> C/C++ -> 코드 생성 -> 런타임 라이브러리를 동일하게 맞춰준다

. 디버깅 레벨이 맞지 않음
error LNK2038: _ITERATOR_DEBUG_LEVEL'에 대해 불일치가 검색되었습니다. '0'값이 '2'(test.obj에 위치) 값과 일치하지 않습니다.
IDE에 포함된 gtest는 x86에 _ITERATOR_DEBUG_LEVEL 값이 2로 되어 있다. 안타깝게도 프로젝트와 디버깅 레벨이 다르다면 레벨을 2로 높이거나 gtest의 레벨을 0으로 낮추면 된다. gtest의 레벨을 낮춰야 한다면 소스를 받아서 새로 빌드를 해야 한다. google test 소스 경로는 아래 경로에서 다운로드한다.
소스 안에 보면 CMakLists.txt 파일이 있어서 cmake를 실행하면 VS에서 빌드할 수 있는 파일들을 생성한다.

이때 기존 프로젝트가
x86 이면 cmake <소스폴더>로 실행하고
x64 이면 cmake -G "Visual studio 15 2017 Win64" <소스폴더>로 실행해야 한다.
이걸 안 맞추고 빌드를 하면 아래와 같은 에러가 발생한다.
'x64' 모듈 컴퓨터 종류가 'x86' 대상 컴퓨터 종류와 충돌합니다.
이후 생성된 googletest 프로젝트 안에서 빌드를 하기 전
프로젝트의 속성 -> 구성 속성 -> C/C++ -> 전처리기 -> 전처리기 정의
에서 _ITERATOR_DEBUG_LEVEL을 맞추고 빌드를 하면 되는데 나의 경우는 기존 프로젝트가 _ITERATOR_DEBUG_LEVEL를 설정한 부분이 없었고, _HAS_ITERATOR_DEBUGGING의 설정 값으로 조정이 되고 있었다. 아래 사이트에서 자세히 나와 있는데 _HAS_ITERATOR_DEBUGGING 값이 _ITERATOR_DEBUG_LEVEL 조정에 연관이 있음을 확인할 수 있었다.

https://learn.microsoft.com/ko-kr/cpp/standard-library/iterator-debug-level?view=msvc-170
_ITERATOR_DEBUG_LEVEL
자세한 정보: _ITERATOR_DEBUG_LEVEL
learn.microsoft.com
전처리기에 _HAS_ITERATOR_DEBUGGING=0 추가

. 타사 라이브러리 문제 및 vcpkg
: LNK2038 에러의 경우 MS에서는 vcpkg를 통해 해당문제를 해결하기를 권장하고 있다.
빌드의 일부로 타사 라이브러리를 구성하려고 할 때 이 오류가 표시되는 경우 C++ 패키지 관리자인 vcpkg 사용하여 라이브러리를 설치하고 빌드하는 것이 좋습니다. vcpkg 크고 증가하는 타사 라이브러리 목록을 지원하고 프로젝트의 일부로 성공적인 빌드에 필요한 모든 구성 속성 및 종속성을 설정합니다.
추가 참고 사이트
google test : https://google.github.io/googletest
VS adapter 최신 release : https://marketplace.visualstudio.com/items?itemName=ChristianSoltenborn.GoogleTestAdapter
Google Test Adapter - Visual Studio Marketplace
Extension for Visual Studio - Adds support for the C++ unit testing framework Google Tests.
marketplace.visualstudio.com
'개발 > 환경구축' 카테고리의 다른 글
mock object(모의 객체) 파일 자동 생성 툴 (0) | 2023.09.12 |
---|---|
코드 커버리지 설치 및 사용 방법(VS 2017+OpenCppCoverage) (0) | 2023.08.29 |
TDD : Unit Test 환경 설정(IntelliJ + java + JUnit) (0) | 2023.01.10 |
[C/C++]VSCode + MinGW + makefile 환경 설정 하기 (2) | 2022.12.11 |
[Raspberry PI] 커널 모듈 빌드를 위한 환경 셋팅 (2) | 2022.11.27 |