googletest 구성하기

여기서는 구글 테스트 프레임워크(이하 googletest)를 설정하는 과정만 살펴보며, 이 프레임워크에 대한 자세한 내용은 다음 두 문서를 참조한다.

미리 준비할 것들

  • googletest는 여기에서 받을 수 있다. 현재 최신 버전은 1.6.0이다.
  • googletest를 컴파일하기 위한 CMake는 여기에서 받을 수 있다. 현재 최신 버전은 2.8.5이다. 설치 파일이 아닌 zip 파일로 된 것을 받아도 된다.
  • Visual Studio .NET 2003 이상
  • googletest 자체를 테스트하려거나 소스 코드를 다시 만들려면 Python 2.3 이상이 필요하다. 그대로 쓰려면 없어도 된다.

컴파일

CMake를 zip 파일로 받았으면 적당한 곳에 압축을 풀고 googletest 역시 압축 파일을 적당한 곳에 풀어 둔다. 앞에서 CMake는 googletest를 컴파일 하기 위한 것이라고 했지만 정확히는 컴파일 하기 위해 필요한 Visual Studio 용 솔루션과 프로젝트 파일을 만들어 준다. 각각 압축을 푼 경로가 C:cmake, C:gtest-1.6.0이라면 다음 과정을 따른다.

Visual Studio 용 솔루션과 프로젝트 파일을 만들어 둘 디렉터리를 만든다. 여기서는 C:gtest-1.6.0msvc로 만들었다(이미 msvc 디렉터리가 있는데 기존 내용이 필요하면 따로 보관해 둔다).

Visual Studio를 실행해 뒀다면 종료하고 명령행에서 다음을 입력한다.

cd c:gtest-1.6.0msvc
c:cmakebincmake c:gtest-1.6.0

Python을 설치하지 않았으면 PythonInterp를 찾을 수 없다는 내용이 나오는데 googletest를 테스트 하지 않거나 코드를 다시 만들지 않는다면 상관 없다. 정상적으로 과정을 마치면 C:gtest-1.6.0msvc에 빌드 파일을 기록했다는 메시지를 볼 수 있다.

해당 디렉터리에서 gtest.sln 파일을 열어보면 프로젝트에 gtest와 gtest_main 두 가지가 있는데, gtest_main은 테스트에서 사용하는 main()에 대한 기본 구현 내용을 제공해 주나 gtest는 직접 구현해야 한다는 차이만 있다. 편한 것을 사용하면 되며 여기서는 gtest를 사용한다. 자세한 내용은 여기를 참조한다.

gtest 빌드 설정에서 주요 차이는 다음과 같다.

Configuration Optimization Inline Function Expansion
Release Maximize Speed (/O2) Any Suitable (/Ob2)
RelWithDebInfo Maximize Speed (/O2) Only __inline (/Ob1)
MinSizeRel Minimize Size (/O1) Only __inline (/Ob1)

Rel이 붙은 것은 모두 릴리스 모드이며 기본적으로 디버그 정보는 모두 포함한다. 여기서는 MinSizeRel을 선택했다.

컴파일 하기 전에 Code Generation 부분을 눈여겨 본다. 릴리스 모드일 때 Runtime Library 설정은 Multi-threaded (/MT)이고 디버그 모드일 때는 Multi-threaded Debug (/MTd)이다. 주의할 점은 googletest 라이브러리와 테스트 프로그램에서 이 설정이 서로 같아야 한다. 즉 googletest 라이브러리는 Microsoft 런타임 라이브러리를 정적 링크해 만들고, 이 googletest 라이브러리를 사용하는 테스트 프로그램은 동적 링크를 하도록 하면 안 된다. 안내문에서는 Visual Studio 2005 이상을 사용할 때 동적 링크를 권장하지만 필요에 따라 사용할 수 있도록 모두 만들어 두는 것도 좋겠다. 참고로 이름에서 160은 버전 정보(1.6.0), u는 유니코드 버전(MBCS 버전일 때는 붙이지 않는다)임을 표시한다.

Runtime: Static version Runtime: DLL version
Release gtest160u.lib gtest160u-md.lib
Debug gtest160ud.lib gtest160ud-md.lib

위에서처럼 링크 방식에 따라 파일 이름을 다르게 만들려면 General – Traget Name을 사용한다.

General - Target Name Setting

이 때 필요하면 프로그램 데이터베이스 파일(pdb) 이름도 함께 바꾸도록 한다. C/C++ – Output Files – Program Database File Name에서 지정할 수 있다.

실제 사용할 때는 앞에서 만든 lib 파일과 include 디렉터리 내용만 있으면 된다.

googletest Library

확인

이제 잘 동작하는지 간단히 확인해 보자. 간단히 Win32 Console Application 프로젝트를 만들고 솔루션 파일용 디렉터리를 따로 만들도록 지정한다. gtest 디렉터리는 솔루션 디렉터리 아래에 두고 헤더와 라이브러리 경로를 다음과 같이 설정한다.

  • C/C++ – General – Additional Include Directories: $(SolutionDir)gtestinclude
  • Linker – General – Additional Library Directories: $(SolutionDir)gtestlib

앞에서 언급한 대로 테스트 프로그램에 맞춰 googletest 라이브러리 파일을 링크한 후 다음 내용을 실행한다.

#include <tchar.h>
#include "gtest\gtest.h"

TEST(GtestSampleTest, testSample) {
  EXPECT_EQ(1, 1);
}

int _tmain(int argc, TCHAR* argv[]) {
  ::testing::InitGoogleTest(&amp;argc, argv);

  return RUN_ALL_TESTS();
}

googletest Sample Test

참고로 테스트 케이스 이름과 테스트 이름에는 한글도 쓸 수 있어 편리하다.

녹색과 빨강 막대를 시각적으로 느껴 보고 싶다면 Google Test UI를 사용할 수 있으며 여기에서 받을 수 있다. 마지막으로, 테스트 프로그램을 컴파일 후 자동으로 실행되도록 하면 편리한데 이는 다음을 설정하면 된다. 실행 결과는 Visual Studio Output 창에서 볼 수 있다.

  • Build Events – Post-Build Event – Command Line: $(TargetPath)

만약 경로에 빈 칸이 있다면 “$(TargetPath)”처럼 큰 따옴표로 둘러 싸면 된다.

You may also like...