개요
지금껏 단위 테스트나 Test-Driven Development 같은 것들을 지나치게 조심스러운 접근방법으로 여겨 왔다. 실제 코드보다 테스트 코드가 더 길고, 개발기간을 불필요하게 늘리는 것 같았기 때문이다. 수십 명 이상의 프로그래머가 협업하는 환경에서라면 필요할 수 있겠지만 뭐, 적어도 나에겐 필요없을 것 같았다.
하지만 이 포스트를 쓰고 있다는 건 결국 필요해졌다는 것. 눈디버깅 뇌컴파일의 시대는 끝이 나고 만 것이다. C++의 무자비한 템플릿 프로그래밍, 파일을 건너건너 이어지는 눈물겨운 상속관계, 코드의 처음부터 끝까지 흐드러지게 피어난 포인터와 레퍼런스를 보고 있자니 기어이 뇌세포에도 쓰로틀링이 걸리긴 하는 것이었다.
아무튼, 컴파일이나 런타임에서 버그가 발견되지 않더라도 코드가 의도한 대로 동작한다고 확신할 수 없으므로 본격적으로 라이브러리를 작성하면서부터 단위 테스트를 찾게 되었다.
gtest
오랜만에 쓰는 글이라 서론이 길었다. C++ unit test framework는 여러 가지가 있을 텐데, 별 고민 없이 gtest를 골랐다. 구글이 만든 거기도 하고, 개발환경 독립적인 세팅이 가능해서 여러모로 좋아 보인다. 뭘 고르던 간에 결국 하는 일은 비슷할 텐데, 그냥 이거 쓰자 싶었다.
개발 환경은 Windows 11, Mingw-32, Cmake, make가 설치되어 있다.(make는 mingw에 포함돼 있어서 굳이 설치할 필요가 없긴 하다)
깃허브에서 리포지토리를 클론한다.
git clone https://github.com/google/googletest.git
cd googletest
옛날에는 Makefile을 제공했던 모양인데 이제는 없다. 아쉬운 대로 Cmake를 사용해 빌드하자. 본인은 Cmake를 별로 안 좋아한다. Makefile이면 다 되는걸.
mkdir build
cd bulid
cmake .. -G "MinGW Makefiles"
make
이제 googletest/build/lib/ 내에 static library 파일이 생겼을 것이다. 관련 헤더파일은 googletest/googletest/include/gtest/ 에 있다. 이것들을 싹 모아서 아래처럼 만들어 주자.
.sample
│ sample1.cc
│ sample1.h
│ sample1_unittest.cc
├─gtest_lib
│ └─헤더파일들
└─gtest
└─헤더파일들
샘플 코드는 googletest/googletest/samples/에 있다. 헤더파일 폴더 이름이 gtest인 이유는 sample1_unittest.cc에서 헤더를 #include "gtest/gtest.h"로 쓰고 있기 때문이다.
이제 빌드해 보자.
g++ -o sample1.exe sample1.cc sample1_unittest.cc -I . -L ./gtest_lib -lgtest -lgtest_main
./sample1.exe
......
[ RUN ] IsPrimeTest.Trivial
[ OK ] IsPrimeTest.Trivial (0 ms)
[ RUN ] IsPrimeTest.Positive
[ OK ] IsPrimeTest.Positive (0 ms)
[----------] 3 tests from IsPrimeTest (5 ms total)
[----------] Global test environment tear-down
[==========] 6 tests from 2 test suites ran. (20 ms total)
[ PASSED ] 6 tests.
잘 된다.
공유 라이브러리 빌드
gtest 라이브러리는 어차피 테스트 용도이고 이걸로 만들어진 실행파일을 남에게 공유할 일도 없다. 굳이 정적 라이브러리로 링크할 필요가 없는 것이다.
동적 라이브러리로 만들려면 Cmake 단계에서 옵션을 줘야 한다.
cmake .. -G "MinGW Makefiles" -DBUILD_SHARED_LIBS=ON
make
Mingw로 컴파일시 필요한 라이브러리 파일은 아까와 같이 googletest/build/lib/에 있고, 만들어진 단위 테스트 실행파일을 실행하는 데 필요한 동적 라이브러리는 googletest/build/bin/에 있다.
여담
이렇게 아주 간단한 방법으로 단위 테스트 환경을 구축할 수 있었다. 늘 그렇듯 나는 삽질을 엄청 했지만 뭐 그건 그거고. 성공했으면 됐지 뭐.
그럼 다음에,
Gabriel-Dropout
at 10:49