SlideShare uma empresa Scribd logo
1 de 19
지속적인 테스트
(Continuous Test)



          남기룡(birdkr@gmail.com)
지속적인 통합
지속적인 컴파일
지속적인 데이터베이스 통합

지속적인 테스트
지속적인 검사
지속적인 배포
지속적인 피드백
One Click?
 테스트 자동화의 목표
   위험 감소
   지루하고 반복적인 프로세스 줄이기
   프로젝트 가시성 높이기
   자신감 얻기
CruiseControl.NET + MSBuild
 CruiseControl.NET
   지속적인 통합을 도와주는 빌드 자동화 툴
   오픈 소스 프로젝트
   Web과 CCTray 트레이 아이콘으로 피드백
 MSBuild
   MS에서 제공하는 빌드 플랫폼
   XML로 복잡한 빌드 프로세스를 쉽게 조작할 수 있다.
단위 테스트
UnitTest++ 라이브러리 사용
대상 : 게임 로직
주기
 개발과 관련된 테스트 케이스 : 컴파일할 때마다 항상
 전체 테스트 케이스 : 저장소에 커밋할 때마다
DB 테스트
xDBUnit은 C++에 맞지 않았다.
UnitTest++와 SQL스크립트를 사용함.
테스트 단계
 테스트 데이터베이스에 테스트 데이터 집합을 생성
 테스트 케이스 실행
 데이터 변경 검증
주기 : 하루에 한 번
Resource Validator
 기획자나 아티스트가 입력한 컨텐츠 설정값에
 논리적으로 잘못된 값이 입력되었는지 검증
 게임을 실행할 때마다 잘못 입력된 값이 있으면
 로그인 화면에서 에러 리포트
 모듈화시켜 맵툴 등에서도 체크할 수 있도록 한다.
 주기 : 게임을 실행할 때마다
통합 테스트
대상 : 단위 테스트 + DB + 컨텐츠(아이템 정보,
퀘스트 정보, 스킬 정보 등)
주기 : 소스를 저장소에 커밋할 때마다
네트워크 스트레스 테스트
클라이언트 패킷 핸들링을 XML로 쉽게 조작
 테스트 케이스
  로그인 반복, 캐릭터 생성,삭제 반복, 이동 반복 등
 스케줄링
Crash가 발생하거나 성능이 일정 수치 이하이면
테스트 실패로 간주
주기 : 일주일에 한 번
AI 전투 테스트
 랜덤으로 특정 맵에 x마리의 몬스터를 스폰시켜
 서로 싸우도록 한다.
 Crash가 발생하거나 성능이 일정 수치 이하이면
 테스트 실패로 간주
 주기 : 하루에 한 번
프레임 테스트(클라이언트)
리플레이 파일을 재생하여 평균 프레임이 특정값
이상이면 테스트 성공
프레임율 그래프 출력
3DMark의 벤치마크 테스트와 유사한 방식
픽셀 테스트(클라이언트)
특정 씬을 렌더링하여 원본 이미지와 같은
이미지인지 픽셀당 비교하여 일정 비율(90%
정도) 이상이면 테스트 성공.
3d 엔진을 포함한 단위 테스트를 만들지 못하여
나온 대안 방법
랜덤 요소 제거 등의 몇가지 추가 작업이 필요함.
그래서~


이 모든 테스트를
   자동화!!
CruiseControl.NET
CruiseControl.NET
CruiseControl.NET에 원하는
내용 출력하기
테스트 결과 XML 로그
<?xml version=quot;1.0quot;?>

<maiettest-results tests=“2quot; failedtests=“1quot; failures=quot;1quot; time=quot;0.137quot;>
         <report text=quot;time : 680 secquot; />
         <report text=“총 클라이언트 개수 : 4650quot; />
         <test name=“로그인 반복quot; time=quot;0.062quot; >
                   <success message=quot;successquot; />
         </test>
         <test name=“캐릭터 생성 반복quot; time=quot;0.062quot; >
                   <failure message=quot;Crash!quot; />
         </test>
</maiettest-results>
Dashboard의 xsl 파일 설정
<xsl:stylesheet version=quot;1.0quot; xmlns:xsl=http://www.w3.org/1999/XSL/Transform >
                              xmlns:xsl=
             <xsl:output method=quot;htmlquot;/>
             <xsl:template match=quot;/quot;>
                         <xsl:variable name=quot;maiettest.result.listquot; select=quot;/cruisecontrol/build/maiettest-resultsquot;/>
                                       name=quot;maiettest.result.listquot; select=quot;/cruisecontrol/build/maiettest-
                         <xsl:variable name=quot;maiettest.report.listquot; select=quot;$maiettest.result.list/reportquot;/>
                                       name=quot;maiettest.report.listquot; select=quot;$maiettest.result.list/reportquot;/>
                         <xsl:variable name=quot;maiettest.case.listquot; select=quot;$maiettest.result.list/testquot;/>
                                       name=quot;maiettest.case.listquot; select=quot;$maiettest.result.list/testquot;/>

                         <table class=quot;section-tablequot; cellpadding=quot;2quot; cellspacing=quot;0quot; border=quot;0quot; width=quot;98%quot;>
                                class=quot;section-        cellpadding=quot;2quot; cellspacing=quot;0quot;
                                     <tr>
                                       tr>
                                                  <td class=quot;sectionheaderquot;>
                                                       class=quot;sectionheaderquot;>
                                                               Maiet Test report:
                                                  </td>
                                     </tr>
                                      </tr>
                                     <xsl:call-template name=quot;maiettest__reportdetailquot;>
                                       xsl:call-         name=quot;maiettest__reportdetailquot;>
                                                  <xsl:with-param name=quot;detailnodesquot; select=quot;//reportquot;/>
                                                    xsl:with-       name=quot;detailnodesquot;
                                     </xsl:call-template>
                                      </xsl:call-
                         </table>

                         <table class=quot;section-tablequot; cellpadding=quot;2quot; cellspacing=quot;0quot; border=quot;0quot; width=quot;98%quot;>
                                class=quot;section-        cellpadding=quot;2quot; cellspacing=quot;0quot;
                                     <tr>
                                       tr>
                                                  <td class=quot;sectionheaderquot; colspan=quot;2quot;>
                                                       class=quot;sectionheaderquot; colspan=quot;2quot;>
                                                               Maiet Test Case results:
                                                  </td>
                                     </tr>
                                      </tr>
                                     <xsl:call-template name=quot;maiettest__testdetailquot;>
                                       xsl:call-         name=quot;maiettest__testdetailquot;>
                                                  <xsl:with-param name=quot;detailnodesquot; select=quot;//testquot;/>
                                                    xsl:with-       name=quot;detailnodesquot;
                                     </xsl:call-template>
                                      </xsl:call-
                         </table>
             </xsl:template>
             </xsl:template>
</xsl:stylesheet>
</xsl:stylesheet>
참고
서적
 지속적인 통합(위키북스)
 리팩토링 데이터베이스(위키북스)
사이트
 http://confluence.public.thoughtworks.org/display/CCN
 ET
 http://msdn.microsoft.com/ko-kr/library/0k6kkbsd.aspx
 http://kaistizen.net/EE/

Mais conteúdo relacionado

Destaque

Rapid Development
Rapid DevelopmentRapid Development
Rapid Development기룡 남
 
Formato de garro
Formato de garroFormato de garro
Formato de garrofrailan
 
All About Me Class 3-405
All About Me Class 3-405All About Me Class 3-405
All About Me Class 3-405Denise McCabe
 
All About Me Class 3-411
All About Me Class 3-411All About Me Class 3-411
All About Me Class 3-411Denise McCabe
 
Responding to change
Responding to changeResponding to change
Responding to change기룡 남
 
refactoring database
refactoring databaserefactoring database
refactoring database기룡 남
 

Destaque (8)

Rapid Development
Rapid DevelopmentRapid Development
Rapid Development
 
Formato de garro
Formato de garroFormato de garro
Formato de garro
 
Fs ma.306.10
Fs ma.306.10Fs ma.306.10
Fs ma.306.10
 
All About Me Class 3-405
All About Me Class 3-405All About Me Class 3-405
All About Me Class 3-405
 
Malharia, camisetas malha fria,
Malharia, camisetas malha fria,Malharia, camisetas malha fria,
Malharia, camisetas malha fria,
 
All About Me Class 3-411
All About Me Class 3-411All About Me Class 3-411
All About Me Class 3-411
 
Responding to change
Responding to changeResponding to change
Responding to change
 
refactoring database
refactoring databaserefactoring database
refactoring database
 

Mais de 기룡 남

GAN을 이용한 캐릭터 리소스 제작 맛보기
GAN을 이용한 캐릭터 리소스 제작 맛보기GAN을 이용한 캐릭터 리소스 제작 맛보기
GAN을 이용한 캐릭터 리소스 제작 맛보기기룡 남
 
NDC 2015 게임 스타트업 시작하기
NDC 2015 게임 스타트업 시작하기NDC 2015 게임 스타트업 시작하기
NDC 2015 게임 스타트업 시작하기기룡 남
 
게임 스타트업 시작하기 두달 후
게임 스타트업 시작하기 두달 후게임 스타트업 시작하기 두달 후
게임 스타트업 시작하기 두달 후기룡 남
 
게임 스타트업 시작하기
게임 스타트업 시작하기게임 스타트업 시작하기
게임 스타트업 시작하기기룡 남
 
마쉬멜로우 첼린지
마쉬멜로우 첼린지마쉬멜로우 첼린지
마쉬멜로우 첼린지기룡 남
 
레이더즈 기술 사례
레이더즈 기술 사례레이더즈 기술 사례
레이더즈 기술 사례기룡 남
 
Ignite Maiet 14 마이에트야구단
Ignite Maiet 14 마이에트야구단Ignite Maiet 14 마이에트야구단
Ignite Maiet 14 마이에트야구단기룡 남
 
Ignite Maiet 12 누구나 쉽게 만드는 음악
Ignite Maiet 12 누구나 쉽게 만드는 음악Ignite Maiet 12 누구나 쉽게 만드는 음악
Ignite Maiet 12 누구나 쉽게 만드는 음악기룡 남
 
Ignite Maiet 10 두근두근사파리 제작후기2
Ignite Maiet 10 두근두근사파리 제작후기2Ignite Maiet 10 두근두근사파리 제작후기2
Ignite Maiet 10 두근두근사파리 제작후기2기룡 남
 
Ignite Maiet 07 칵테일과 함께 훈남훈녀 되기
Ignite Maiet 07 칵테일과 함께 훈남훈녀 되기Ignite Maiet 07 칵테일과 함께 훈남훈녀 되기
Ignite Maiet 07 칵테일과 함께 훈남훈녀 되기기룡 남
 
Ignite Maiet 03 순정만화를 게임으로 재현하기
Ignite Maiet 03 순정만화를 게임으로 재현하기Ignite Maiet 03 순정만화를 게임으로 재현하기
Ignite Maiet 03 순정만화를 게임으로 재현하기기룡 남
 
생산적인 개발을 위한 지속적인 테스트
생산적인 개발을 위한 지속적인 테스트생산적인 개발을 위한 지속적인 테스트
생산적인 개발을 위한 지속적인 테스트기룡 남
 
KGC2007 Scrum And Xp
KGC2007 Scrum And XpKGC2007 Scrum And Xp
KGC2007 Scrum And Xp기룡 남
 
Game AI Overview
Game AI OverviewGame AI Overview
Game AI Overview기룡 남
 
Gunz Postmortem
Gunz PostmortemGunz Postmortem
Gunz Postmortem기룡 남
 

Mais de 기룡 남 (16)

GAN을 이용한 캐릭터 리소스 제작 맛보기
GAN을 이용한 캐릭터 리소스 제작 맛보기GAN을 이용한 캐릭터 리소스 제작 맛보기
GAN을 이용한 캐릭터 리소스 제작 맛보기
 
NDC 2015 게임 스타트업 시작하기
NDC 2015 게임 스타트업 시작하기NDC 2015 게임 스타트업 시작하기
NDC 2015 게임 스타트업 시작하기
 
게임 스타트업 시작하기 두달 후
게임 스타트업 시작하기 두달 후게임 스타트업 시작하기 두달 후
게임 스타트업 시작하기 두달 후
 
게임 스타트업 시작하기
게임 스타트업 시작하기게임 스타트업 시작하기
게임 스타트업 시작하기
 
마쉬멜로우 첼린지
마쉬멜로우 첼린지마쉬멜로우 첼린지
마쉬멜로우 첼린지
 
레이더즈 기술 사례
레이더즈 기술 사례레이더즈 기술 사례
레이더즈 기술 사례
 
Pm
PmPm
Pm
 
Ignite Maiet 14 마이에트야구단
Ignite Maiet 14 마이에트야구단Ignite Maiet 14 마이에트야구단
Ignite Maiet 14 마이에트야구단
 
Ignite Maiet 12 누구나 쉽게 만드는 음악
Ignite Maiet 12 누구나 쉽게 만드는 음악Ignite Maiet 12 누구나 쉽게 만드는 음악
Ignite Maiet 12 누구나 쉽게 만드는 음악
 
Ignite Maiet 10 두근두근사파리 제작후기2
Ignite Maiet 10 두근두근사파리 제작후기2Ignite Maiet 10 두근두근사파리 제작후기2
Ignite Maiet 10 두근두근사파리 제작후기2
 
Ignite Maiet 07 칵테일과 함께 훈남훈녀 되기
Ignite Maiet 07 칵테일과 함께 훈남훈녀 되기Ignite Maiet 07 칵테일과 함께 훈남훈녀 되기
Ignite Maiet 07 칵테일과 함께 훈남훈녀 되기
 
Ignite Maiet 03 순정만화를 게임으로 재현하기
Ignite Maiet 03 순정만화를 게임으로 재현하기Ignite Maiet 03 순정만화를 게임으로 재현하기
Ignite Maiet 03 순정만화를 게임으로 재현하기
 
생산적인 개발을 위한 지속적인 테스트
생산적인 개발을 위한 지속적인 테스트생산적인 개발을 위한 지속적인 테스트
생산적인 개발을 위한 지속적인 테스트
 
KGC2007 Scrum And Xp
KGC2007 Scrum And XpKGC2007 Scrum And Xp
KGC2007 Scrum And Xp
 
Game AI Overview
Game AI OverviewGame AI Overview
Game AI Overview
 
Gunz Postmortem
Gunz PostmortemGunz Postmortem
Gunz Postmortem
 

Continuous Test

  • 1. 지속적인 테스트 (Continuous Test) 남기룡(birdkr@gmail.com)
  • 2. 지속적인 통합 지속적인 컴파일 지속적인 데이터베이스 통합 지속적인 테스트 지속적인 검사 지속적인 배포 지속적인 피드백
  • 3. One Click? 테스트 자동화의 목표 위험 감소 지루하고 반복적인 프로세스 줄이기 프로젝트 가시성 높이기 자신감 얻기
  • 4. CruiseControl.NET + MSBuild CruiseControl.NET 지속적인 통합을 도와주는 빌드 자동화 툴 오픈 소스 프로젝트 Web과 CCTray 트레이 아이콘으로 피드백 MSBuild MS에서 제공하는 빌드 플랫폼 XML로 복잡한 빌드 프로세스를 쉽게 조작할 수 있다.
  • 5. 단위 테스트 UnitTest++ 라이브러리 사용 대상 : 게임 로직 주기 개발과 관련된 테스트 케이스 : 컴파일할 때마다 항상 전체 테스트 케이스 : 저장소에 커밋할 때마다
  • 6. DB 테스트 xDBUnit은 C++에 맞지 않았다. UnitTest++와 SQL스크립트를 사용함. 테스트 단계 테스트 데이터베이스에 테스트 데이터 집합을 생성 테스트 케이스 실행 데이터 변경 검증 주기 : 하루에 한 번
  • 7. Resource Validator 기획자나 아티스트가 입력한 컨텐츠 설정값에 논리적으로 잘못된 값이 입력되었는지 검증 게임을 실행할 때마다 잘못 입력된 값이 있으면 로그인 화면에서 에러 리포트 모듈화시켜 맵툴 등에서도 체크할 수 있도록 한다. 주기 : 게임을 실행할 때마다
  • 8. 통합 테스트 대상 : 단위 테스트 + DB + 컨텐츠(아이템 정보, 퀘스트 정보, 스킬 정보 등) 주기 : 소스를 저장소에 커밋할 때마다
  • 9. 네트워크 스트레스 테스트 클라이언트 패킷 핸들링을 XML로 쉽게 조작 테스트 케이스 로그인 반복, 캐릭터 생성,삭제 반복, 이동 반복 등 스케줄링 Crash가 발생하거나 성능이 일정 수치 이하이면 테스트 실패로 간주 주기 : 일주일에 한 번
  • 10. AI 전투 테스트 랜덤으로 특정 맵에 x마리의 몬스터를 스폰시켜 서로 싸우도록 한다. Crash가 발생하거나 성능이 일정 수치 이하이면 테스트 실패로 간주 주기 : 하루에 한 번
  • 11. 프레임 테스트(클라이언트) 리플레이 파일을 재생하여 평균 프레임이 특정값 이상이면 테스트 성공 프레임율 그래프 출력 3DMark의 벤치마크 테스트와 유사한 방식
  • 12. 픽셀 테스트(클라이언트) 특정 씬을 렌더링하여 원본 이미지와 같은 이미지인지 픽셀당 비교하여 일정 비율(90% 정도) 이상이면 테스트 성공. 3d 엔진을 포함한 단위 테스트를 만들지 못하여 나온 대안 방법 랜덤 요소 제거 등의 몇가지 추가 작업이 필요함.
  • 17. 테스트 결과 XML 로그 <?xml version=quot;1.0quot;?> <maiettest-results tests=“2quot; failedtests=“1quot; failures=quot;1quot; time=quot;0.137quot;> <report text=quot;time : 680 secquot; /> <report text=“총 클라이언트 개수 : 4650quot; /> <test name=“로그인 반복quot; time=quot;0.062quot; > <success message=quot;successquot; /> </test> <test name=“캐릭터 생성 반복quot; time=quot;0.062quot; > <failure message=quot;Crash!quot; /> </test> </maiettest-results>
  • 18. Dashboard의 xsl 파일 설정 <xsl:stylesheet version=quot;1.0quot; xmlns:xsl=http://www.w3.org/1999/XSL/Transform > xmlns:xsl= <xsl:output method=quot;htmlquot;/> <xsl:template match=quot;/quot;> <xsl:variable name=quot;maiettest.result.listquot; select=quot;/cruisecontrol/build/maiettest-resultsquot;/> name=quot;maiettest.result.listquot; select=quot;/cruisecontrol/build/maiettest- <xsl:variable name=quot;maiettest.report.listquot; select=quot;$maiettest.result.list/reportquot;/> name=quot;maiettest.report.listquot; select=quot;$maiettest.result.list/reportquot;/> <xsl:variable name=quot;maiettest.case.listquot; select=quot;$maiettest.result.list/testquot;/> name=quot;maiettest.case.listquot; select=quot;$maiettest.result.list/testquot;/> <table class=quot;section-tablequot; cellpadding=quot;2quot; cellspacing=quot;0quot; border=quot;0quot; width=quot;98%quot;> class=quot;section- cellpadding=quot;2quot; cellspacing=quot;0quot; <tr> tr> <td class=quot;sectionheaderquot;> class=quot;sectionheaderquot;> Maiet Test report: </td> </tr> </tr> <xsl:call-template name=quot;maiettest__reportdetailquot;> xsl:call- name=quot;maiettest__reportdetailquot;> <xsl:with-param name=quot;detailnodesquot; select=quot;//reportquot;/> xsl:with- name=quot;detailnodesquot; </xsl:call-template> </xsl:call- </table> <table class=quot;section-tablequot; cellpadding=quot;2quot; cellspacing=quot;0quot; border=quot;0quot; width=quot;98%quot;> class=quot;section- cellpadding=quot;2quot; cellspacing=quot;0quot; <tr> tr> <td class=quot;sectionheaderquot; colspan=quot;2quot;> class=quot;sectionheaderquot; colspan=quot;2quot;> Maiet Test Case results: </td> </tr> </tr> <xsl:call-template name=quot;maiettest__testdetailquot;> xsl:call- name=quot;maiettest__testdetailquot;> <xsl:with-param name=quot;detailnodesquot; select=quot;//testquot;/> xsl:with- name=quot;detailnodesquot; </xsl:call-template> </xsl:call- </table> </xsl:template> </xsl:template> </xsl:stylesheet> </xsl:stylesheet>
  • 19. 참고 서적 지속적인 통합(위키북스) 리팩토링 데이터베이스(위키북스) 사이트 http://confluence.public.thoughtworks.org/display/CCN ET http://msdn.microsoft.com/ko-kr/library/0k6kkbsd.aspx http://kaistizen.net/EE/