이번 리뉴얼 목표에 테스트 드리븐을 적용하는 것도 포함되어있습니다. 여러 단위 테스트 라이브러리가 있는데 이전에도 사용해본적 있고 또 많이 사용되고 있는 UnitTest++를 적용하기로 했습니다. 구글의 GTest에도 눈이 갔지만 왠지 UnitTest++가 더 끌리더군요. 

UnitTest++ 프로젝트를 추가한 모습

UnitTest++ 적용법을 간단히 적어보겠습니다. 일단 최신 버전 UnitTest++를 다운 받습니다.


압축을 풀면 대략 밑의 화면 처럼 나옵니다. 솔루션 파일은 2003과 2005만 있는데 2008의 경우 2005 솔루션파일을 변환하여 바로 사용 가능합니다. 2010은 어떨지 모르겠네요;;;


이제 빌드를 해줍니다. 그러면 Lib 파일이 생성 됩니다. UnitTest++를 사용하기 위해 필요한것은 이 Lib파일과 src 폴더 안의 헤더들 뿐입니다. 관리하기 편하게 추가할 프로젝트 폴더에 UnitTest 하위 폴더를 하나 만들어서 그곳에 다 넣어줍니다. 저의 경우 UnitTest 하위 폴더를 만들어서 Include / Lib 폴더에 각각 헤더와 Lib 파일을 넣어뒀습니다.

 \Lib
 \Include
 \Include\Posix
 \Include\tests
 \Include\Win32

다음으로 UnitTest++ 프로젝트를 추가합니다. UnitTest++는 단순히 테스트 결과를 출력해주는 프로젝트인 만큼 Win32 콘솔 프로그램 프로젝트만으로 충분합니다. 


이 프로젝트에 UnitTest++.h와 UnitTest++.lib(이름이 좀 다를수 있습니다) 를 추가 하는 것으로 UnitTest++를 사용하기 위한 준비가 끝납니다.

#include "Include\UnitTest++.h"
#pragma comment ( lib, "UnitTest++.lib")
int main(int argc, char const *argv[])
{
	return UnitTest::RunAllTests();
}

이제 단위 테스트를 수행할수 있는 환경이 조성되었습니다. EVE 프로젝트 같은 경우 엔진단의 EVE가 정적 라이브러리로 작성 되어 있기때문에 UnitTest 프로젝트에서 단순히 EVE의 Lib와 헤더만 불러오면 EVE 프로젝트에 대한 단위 테스트를 수행 할수 있습니다. 얼마전에 추가한 Quaternion 타입에 대한 단위 테스트 예제를 보여드리겠습니다. 여러 연산 함수들의 결과값이 DirectX 함수들을 사용한 값 처럼 정확하게 출력되는지 확인하는 코드입니다.

SUITE( evQuaternionTest )
{
	TEST( evQuaternion_FromAngleAxis )
	{
		D3DXQUATERNION qRot_DX;
		ev_CQuaternion qRot_EV;

		D3DXQuaternionRotationAxis( &qRot_DX, &D3DXVECTOR3( 1, 0, 0 ), 10 );
		qRot_EV.FromAngleAxis( 10, ev_CVector3::UNIT_X );
		CHECK_CLOSE( qRot_DX.x, qRot_EV.x, 0.00001f );

		D3DXQuaternionRotationAxis( &qRot_DX, &D3DXVECTOR3( 0, 1, 0 ), 20 );
		qRot_EV.FromAngleAxis( 20, ev_CVector3::UNIT_Y );
		CHECK_CLOSE( qRot_DX.y, qRot_EV.y, 0.00001f );

		D3DXQuaternionRotationAxis( &qRot_DX, &D3DXVECTOR3( 0, 0, 1 ), 50 );
		qRot_EV.FromAngleAxis( 50, ev_CVector3::UNIT_Z );
		CHECK_CLOSE( qRot_DX.z, qRot_EV.z, 0.00001f );
	}

	TEST( evQuaternion_FromRotationMatrix )
	{
		D3DXMATRIX matRot;
		D3DXMatrixRotationX( &matRot, 30 );

		D3DXQUATERNION qRot_DX;
		ev_CQuaternion qRot_EV;

		D3DXQuaternionRotationMatrix( &qRot_DX, &matRot );
		qRot_EV.FromRotationMatrix( evConToEVMat( matRot ) );
		
		CHECK_CLOSE( qRot_DX.x, qRot_EV.x, 0.00001f );
		CHECK_CLOSE( qRot_DX.y, qRot_EV.y, 0.00001f );
		CHECK_CLOSE( qRot_DX.z, qRot_EV.z, 0.00001f );
		CHECK_CLOSE( qRot_DX.w, qRot_EV.w, 0.00001f );
	}

	TEST( evQuaternion_FromYawPitchRoll )
	{
		D3DXQUATERNION qRot_DX;
		ev_CQuaternion qRot_EV;

		D3DXQuaternionRotationYawPitchRoll( &qRot_DX, 10, -30, 50 );
		qRot_EV.FromYawPitchRoll( 10, -30, 50 );

		CHECK_CLOSE( qRot_DX.x, qRot_EV.x, 0.00001f );
		CHECK_CLOSE( qRot_DX.y, qRot_EV.y, 0.00001f );
		CHECK_CLOSE( qRot_DX.z, qRot_EV.z, 0.00001f );
		CHECK_CLOSE( qRot_DX.w, qRot_EV.w, 0.00001f );
	}
}
테스트가 정상적으로 통과 되면 밑의 스샷 처럼 출력되어 나옵니다. 실패하면 실패한 테스트의 이름과 이유가 같이 출력됩니다.


  1. BlogIcon 해피버드 2011.01.17 08:39 신고

    우옹~! 열심히 하는걸!? 나도 좀 본받아야겠어~ ㅋㅋㅋ

  2. BlogIcon 구차니 2011.01.20 18:02 신고

    개인이 직접 만든 프로젝트에 이러한 Unit 테스트를 적용하려면 어떻게 해야하나요?
    EVE 프로젝트(?)는 원래부터 Unit 테스트가 포함되어 있는건가요?

    • BlogIcon 친절한티스 2011.01.20 21:24 신고

      ㅎㅎ 이번에 추가한거예요.

      본문에 적은 것처럼 UnitTest 소스 받아다가 Lib 빌드해서 기존 사용하던 프로젝트에 새로운 프로젝트 하나 추가해서 사용하시면 되욤.

  3. 초보개발자 2011.01.24 16:48

    안녕하세요 저는 티스님 처럼 개임프로그래머가 되고 싶은 학생입니다. 현재 C++와 C winapi를 공부하고 이제막 directx공부를 시작하려 하는데요 이외에도 알고리즘이나 AI나 기본적 프로그램밍 기술을 공부하려면 어떤걸 공부해야 하는지좀 알려주실수 있는지요, 수학이나 물리도요 게임프로그래머가 되기위한 공부들이 알고싶어요.

    • BlogIcon 친절한티스 2011.01.24 18:06 신고

      질문이 상당히 광범위 하네요. ㅎㅎ 이제 DirectX를 시작하시려고 하신다면 일단 기본부터 파악 하시고, 그 다음 원하시는 분야를 공부하시는게 나을 듯 싶네요.

      DirectX는 국내에서는 거의 바이블이라 불리우는 용책과 해골책을 통해 초급을 띠시구요. 그 다음 게임 구조에 대해 파악하시는게 좋을거라 생각됩니다. ( 이쪽은 공개게임엔진이나 소스 공개된 게임등을 분석하시면 좋겠네요 )

      그래픽스/물리/AI 등을 아무리 잘한다 하더라도 그걸 실제 게임에 활용 못한다면 의미 없겠죠. 게임 구조가 유연하지 못하면 이러한 추가 요소들을 제대로 활용하기가 힘들어집니다. 나중에 수정 할때도 문제가 생기죠. 이쪽은 디자인 패턴이라든가 객체지향 관련 책이나 문서등을 보시면 많은 도움이 되실겁니다.

      그리고 어느정도 돌아가는 환경을 조성할수 있게 되면 실제로 이것저것 제작해보고 테스트 해볼 수 있으니 원하시는 분야를 집중적으로 파보세요. AI라면 AI, 그래픽스라면 그래픽스 식으로 말이죠.

  4. 은령 2011.02.05 12:42

    이거 연재 시작즈음에 Project AR이었을 땐 비공개 포폴용이었던것 같은데
    지금 Evolution Engine->EVE(?) 도 그 연장선인가요?

    • BlogIcon 친절한티스 2011.02.06 02:04 신고

      으헉~ 계속 봐주셨군요. ㅠㅠ 감격!!!

      네. 시작은 ProjectAR이라는 이름으로 시작했고, 중간에 한번 싹 갈아엎기로 하면서 EVE( Evolution V Engine )이라는 되도 않는 이름으로 바꾸고, 계속 작업 중입니다. 하하하하;;;

    • 은령 2011.02.06 17:44

      역시 동일한 물건이었군요. ㅎㅎ

  5. BlogIcon ozlael 2011.05.24 12:51

    에잇 짤방 역주행 구경중이였는데 여기서 끊기네요!!!

+ Recent posts