2020-07-09 github.io에서 작성
xUnit test 는 코드를 최소한으로 쪼개어 unit마다 테스트를 진행하며 에러를 사전에 찾겠다는 방법입니다.
앞에 x가 들어가는 것은 언어를 뜻하며 Java는 j .Net는 N 등을 사용합니다.
최근 프로그램을 개발하는 방법 중에 TDD(Test-driven Development) 개발 방법이 많이 떠오르고 있습니다.
용어 그대로 테스트 주도 개발로 개발을 진행하면서 지속적인 테스트와 테스트 결과를 통해 에러를 최소화시키겠다는 개념입니다.
프로그래밍을 적용시킬 수 있는 분야는 엄청나게 넓어서 분야마다 적용 시킬 수 있는 범위가 다르겠지만 최대한 많은 unit test를 목표로 개발을 진행 할 수 있었으면 좋겠습니다.
Gtest(Google Test)는 c++에서 가장 많이 쓰이는 unit test framework중 하나입니다.
Microsoft Docs에서도 아래와 같이 네 가지의 unit test를 안내하고 있습니다.
Gtest는 Github의 google 페이지에서 받을 수 있습니다.
linux와 window 버전 모두 적을 예정이나 다운받은 폴더가 모두 다르므로 GTest를 내려받은 폴더는 %GTEST_RELEASE%
로 표시하겠습니다.
Visual studio 2010은 C++11을 온전히 지원하지 않는 IDE입니다.
그러므로 pre-C++11 Compiler 를 지원하는 GTest Release v1.8.1을 받아 컴파일합니다.
마침 v.1.8.1은 MSCV2010 컴파일 환경을 제공하므로 압축을 풀어서 mscv폴더 안의 sln 파일을 열어 컴파일 해 주면 됩니다.
win32/x64
와 Debug/Release
환경을 모두 컴파일 해 주면 아래와 같은 lib
파일을 얻을 수 있습니다.
.\mscv\gtest\Win32-Debug\gtestd.lib
.\mscv\gtest\Win32-Debug\gtest_maind.lib
.\mscv\gtest\Win32-Release\gtest.lib
.\mscv\gtest\Win32-Release\gtest_main.lib
.\mscv\gtest\x64-Debug\gtestd.lib
.\mscv\gtest\x64-Debug\gtest_maind.lib
.\mscv\gtest\x64-Release\gtestd.lib
.\mscv\gtest\x64-Release\gtest_maind.lib
GTest는 Console 환경에서 동작합니다.
Visual studio에서 프로젝트 생성 시 Console 응용 프로그램으로 선택하여 GTest 환경을 구성합니다.
visual studio IDE에서 프로젝트의 속성(Property)를 열어서 header
파일과 library
파일을 추가 해 줍니다.
GTest header
파일은 %GTEST_RELEASE%\googletest\include
에 있습니다.
GTest library
파일은 우리가 다운받으면서 컴파일 했으므로 컴파일 환경에 따라 다른 위치에 존재 할 것입니다.
간단하게 %GTEST_COMPILED_LIB%
로 표시하겠습니다.
%GTEST_RELEASE%\googletest\include
%GTEST_COMPILED_LIB%
Release :
gtest.lib, gtest_main.lib
Debug :gtestd.lib, gtest_maind.lib
또한 GTest는 런타임라이브러리가 다중 스레드 디버그(/MTd)
상태에서 동작하도록 설계되었습니다. 그러므로
다중 스레드 디버그(/MTd)
선택
이 글에서는 unit test를 사용하는 방법에 대해서는 다루지 않겠습니다.
테스트 방법론에 대해서는 직접 쓰면서 알아가거나 검색을 통하여 습득하는것이 좋을 같습니다.
GTest를 사용 할 때 main구문에서 아래와 같은 코드를 꼭 써 줍니다. GTest를 실행시키겠다는 코드로 인식하면 좋겠습니다.
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
테스트 샘플 코드는 아래와 같습니다.
GTest가 정상적으로 동작하는지 확인하기 위한 간단한 코드입니다.
#include "gtest/gtest.h"
TEST( TestName, Subtest_1) {
ASSERT_TRUE(1 == 1);
}
TEST( TestName, Subtest_2) {
ASSERT_TRUE(1 == 2);
}
TEST( TestName, Subtest_3) {
ASSERT_FALSE(1 == 2);
}
TEST( TestName2, Subtest_1) {
ASSERT_EQ(1,1);
}
TEST( testName3, Subtest_1) {
EXPECT_EQ(1,2);
}
int _tmain(int argc, _TCHAR* argv[])
{
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
실행을 시키면 아래와 같은 결과를 얻게 됩니다.
테스트에서 실패한 코드는 FAILED
로 나타나서 무엇때문에 틀렸는지 쉽게 알아 볼 수 있습니다.