게임 프로그래밍에서 단위 테스트가 가능합니까?
단위 테스트에 대한 아이디어는 좋아하지만 게임 프로그래밍에 적용하는 데 문제가 있습니다. 게임은 상태가 매우 높으며 종종 코드가 별개의 단위로 분리되지 않습니다. 내 경험상 대부분의 함수는 값을 반환하는 대신 상태를 변경합니다.
와 같은 간단한 작업을 고려하십시오 playerJump(height)
. 점프가 항상 예상대로 작동하는지 확인하기 위해 다양한 사례를 확인하는 테스트 스위트를 갖고 싶습니다. 그러나,이 함수는 확률 값을 반환하지 않으며 부작용을 의지 player.velocity.y = -height
하고 checkCollisions(player)
. 나는 이것을 중심으로 명확한 단위 테스트를 생각할 수 없습니다.
단위 테스트는 게임과 같은 고도로 상태 저장 애플리케이션에서 실행 가능하지 않습니까? 단위 테스트의 장점이 너무 커서 게임을 기능적으로 프로그래밍 할 가치가 있습니까?
최신 정보:
Games from Within에는 게임에서 테스트 주도 개발을 사용하는 방법에 대한 일련의 심층 기사가 있습니다. 이 주제에 관심이있는 사람에게 강력히 추천합니다. 다음은 첫 번째 기사입니다.
http://gamesfromwithin.com/stepping-through-the-looking-glass-test-driven-game-development-part-1
종종 코드는 고유 한 단위로 분리되지 않습니다.
그것은 단지 형편없는 디자인입니다. 코드 자체는 어떤 것으로도 분해되지 않습니다. 디자이너는 코드에 구조를 적용하여 실제로 작동 함을 보여 주어야합니다.
그러나이 함수는 값을 반환하지 않을 가능성이 높습니다.
그래서?
... 및 부작용을 가지고, player.velocity.y = -height
그리고 checkCollisions(player)
.
그런 다음 테스트하십시오.
나는 이것을 중심으로 명확한 단위 테스트를 생각할 수 없습니다.
왜 안돼? 함수 결과에 대해 훌륭한 사양을 제공했습니다.
본격적인 Player를 테스트하기 더 쉬운 단순화 된 MockPlayer로 대체하려면 몇 가지 모의 객체가 필요할 수 있습니다.
그러나 당신의 행동 사양은 완벽했습니다. 당신이 묘사 한 것들을 테스트 해보세요.
단위 테스트는 게임 코드와 함께 사용할 수있는 많은 저수준 라이브러리에 유용 할 수 있지만 높은 수준의 항목에 많이 사용되는 것은 진지하게 의심됩니다. 게임은 일반적으로 시뮬레이션이며 의미있게 모의하고 격리 테스트 할 수없는 엄청난 양의 공유 상태에 의존합니다. 종종 게임의 함수는 즉시 확인할 수있는 어떤 종류의 값도 반환하지 않고 대신 미래의 어느 시점에서 완료되어야하는 프로세스를 설정합니다. 이러한 동작을 테스트하는 것은 가치가 있지만 코드 조각을 격리하여 테스트하는 단위 테스트 아이디어에 대해 상당히 다른 접근 방식이 필요합니다.
프로그래밍은 프로그래밍입니다. 단위 테스트는 오류를 감지하고 수정하는 데 도움이되기 때문에 모든 종류의 애플리케이션에 유용합니다 (더 중요한 것은 코드를 리팩터링 할 때 실수로 발생한 회귀).
물론 단위 테스트가 어려운 높은 수준의 동작 영역이 있지만 실제로는 단위 테스트의 목적이 아닙니다. 주로 개별 메서드 나 코드베이스의 작은 부분이해야 할 일을 수행하는지 확인하기위한 것입니다.
더 높은 수준의 동작을 위해서는 다른 테스트 접근 방식을 적용해야합니다 (예 : 회귀 테스트 : 고정 된 입력 시퀀스를 게임에 공급 한 다음 매번 동일한 결과를 얻었는지 확인하거나 고정 된 위치에서 카메라 뷰 생성). 항상 동일한 (또는 적어도 합리적으로 유사한) 이미지를 생성하는지 확인)
PlayerJump의 예가 그러한 경우 중 하나입니다. 이를 상수 입력으로 분리하여 단위 또는 회귀 테스트를 수행 할 수 있습니다 (프로그래밍 방식으로 간단한 테스트 장면의 고정 된 위치에 플레이어 캐릭터를 배치하고 점프 이벤트를 발생시킨 다음 충돌 또는 최종 휴식 장소가 일관성이 있는지 확인합니다.) 플레이어가 점프 할 수있는 서로 다른 오브젝트의 라이브러리를 사용하면 많은 테스트 케이스를 다룰 수 있습니다 (예 : 지정된 최대 점프 거리의 갭에서 점프가 성공하는 경우).
그 외에도 게임에는 많은 게임 플레이 테스트가 필요합니다 (실제 사용자가 단순히 플레이하는 경우). 이렇게하면 자동화 된 테스트로 다루지 않은 이상한 사례를 찾을 수 있지만 더 중요한 것은 자동화 된 테스트가 절대로 대답하지 않는 질문에 답할 것입니다. "느낌"이 맞습니까? "재미 있습니까"? 인간 만이 수행 할 수있는 테스트입니다.
Crysis 2 개발 중 유닛 및 자동화 테스트에 대한 저의 경험은 여기에서 확인할 수 있습니다. http://yetanothergameprogrammingblog.blogspot.com/2010/06/aaa-automated-testing.html 도움이 되기를 바랍니다.
요약:
자동화 된 테스트는 결과물 안정성을 개선하여 콘텐츠 제작자와 엔지니어 모두의 생산성을 향상시킵니다. 자동화 된 테스트는 코드 품질을 개선하고 초과 근무를해야하는 기회를 줄이는 효과적인 도구입니다. 게임 산업은 전반적으로 매우 반동적이며 자동화 된 테스트는 여러 가지를 충족합니다. 비합리적인 주장 테스트라고 부르지 말고, 다른 것으로 부르세요. (행동 주도 개발을보세요) 유연하게, 좋은 테스트를 작성하는 것은 어렵고, 게임 산업에서 널리 사용되지 않는 기술이 필요합니다.
유닛 테스팅은 유닛이 얼마나 "상태를 유지하는지"전혀 신경 쓰지 않습니다. 어느 정도 독립적 인 코드가 있으며 입력 및 출력 벡터가 크면 테스트가 어렵습니다. 이러한 벡터가 실행 전후의 상태로 배치되는지 여부는 테스트에 대해 약간 변경되지 않습니다. 그러나 대부분의 단순한 단위 테스트 자습서 / 문서에서와 같이 테스트 케이스를 정의하는 적절한 방법을 생각할 수 없다고 말하고 싶다면, 즉 테스트 주제는 "f (x) = y"와 같은 것입니다. 네, 동의합니다. 인간의 지팡이가 제공하는 소수의 (x [100], y [99]) 벡터가 충분한 범위 (숫자!)를 산출한다는 것을 증명하는 데 어려움을 겪을 것입니다. 통합 속성과 불변성을 공식화하고 자동 테스트를 시도하십시오.
자동화 된 단위 테스트 생성을위한 PEX 를 살펴보십시오 . 가능한 모든 입력 변형에 대한 단위 테스트를 생성하여 가능한 많은 조합을 테스트하는 데 도움이됩니다.
많은 게임 프로그래머가 엔티티 구성 요소 시스템 아키텍처를 사용 합니다. 게임 오브젝트에 대한 동작을 더 쉽게 수정할 수 있기 때문에 그렇게합니다. 하지만 그렇게되면 코드 단위 테스트도 더 쉬워집니다.
참조 URL : https://stackoverflow.com/questions/2418845/is-unit-testing-viable-in-game-programming
'programing' 카테고리의 다른 글
Android의 CoordinatorLayout에서 다른보기 아래에보기 위치 지정 (0) | 2021.01.15 |
---|---|
cmake에서 생성 한 Visual Studio C ++ 프로젝트의 헤더 파일 나열 (0) | 2021.01.15 |
활동을 등록 할 때 "점"은 무엇입니까? (0) | 2021.01.15 |
iOS 4.2+ 웹 폰트 (ttf)의 굵은 글꼴 두께 렌더링 버그 (0) | 2021.01.15 |
단항 더하기 및 빼기 연산자의 중요한 용도는 무엇입니까? (0) | 2021.01.15 |