단위 테스트가 용이하도록 게임 소프트웨어를 설계하는 방법은 무엇입니까?


25

게임 개발 상황에서 JUnit과 같은 테스트 프레임 워크를 사용하는 것이 실용적입니까? 게임을 더욱 테스트하기 위해 어떤 종류의 디자인 고려 사항을 따를 수 있습니까? 게임의 어떤 부분을 테스트 할 수 있고 어떤 부분을 인간의 테스트에 맡겨야합니까?

예를 들어, 게임 루프가 하나의 기능으로 캡슐화되어 있으면 테스트하기가 매우 어려울 것 같습니다. 나는 시간 델타를 취하고 게임 로직을 발전시키는 "업데이트"기능을 리팩토링하고 싶다. 이것은 가짜, 느린 시간 델타를 공급함으로써 게임 속도를 늦출 수있는 능력과 같은 흥미로운 트릭을 허용합니다.


6
사실상 끝없는 노예 노동 군대가 당신을 위해 플레이 테스트를 할 때 인력 테스트를 작성하는 데 왜 노동 시간을 낭비합니까? 아이 아이, 아이 아이 ...;)
Mike Strobel

1
실제로 당신은 아이가 필요하지 않습니다, 그것은 정말 좋은 지적입니다! 나는 그것에 대해 생각하지 않았지만 게임은 다른 사람들이 테스트 할 수있는 가장 쉬운 유형의 소프트웨어입니다. 자동 게임 테스트의 어려움 (단위 또는 기타)을 다소 상쇄한다고 생각합니다.
Ricket

3
단위 테스트는 반드시 애플리케이션이 전체적으로 올바르게 작동하는지 확인하는 것이 아닙니다 (즉, 기능 테스트). 향후 변경으로 인해 기존 기능이 손상되지 않도록하는 것이 중요합니다. 물론 사용자는 우주선이 거꾸로되어있는 것을 볼 수 있지만 경로 알고리즘이 .001까지 꺼져 있으면 200 시간 동안 게임을 플레이 할 때까지 효과가 나타나지 않을 수 있습니다. 그것이 코드가 문을 열기 전에 단위 테스트가 잡을 수있는 것들입니다.
웨이드 윌리엄스

1
게임은 사용자가 게임 을 할 수있는 가장 쉬운 소프트웨어 이지만! = testing 입니다. 좋은 버그 보고서를 얻는 것은 매우 어렵습니다. 그 외에도 코드에서 버그가 발생하는 위치를 추적하고 새로운 변경 사항이 기존 코드를 위반하지 않는지 확인하면 자동화 된 테스트의 이점이 크게 향상됩니다.
munificent

답변:


25

TDD의 신조 중 하나는 경우에 따라 TDD가 설계에 영향을 미친다는 것입니다. 시스템에 대한 테스트를 작성한 다음 테스트를 통과하도록 코드를 작성하고 종속성을 가능한 한 얕게 유지하십시오.

나에게 단위 테스트의 일부로 테스트하지 않는 것은 두 가지뿐입니다.

먼저 시각적 요소와 사물이 어떻게 보이는지 테스트하지 않습니다. 테스트 후 객체가 올바른 위치에 있는지 테스트하고 카메라가 경계 외부의 객체를 컬링하고 변환 (적어도 셰이더 외부에서 수행되는 객체)이 그래픽 엔진에 전달되기 전에 올바르게 수행되는지 테스트합니다. 그래픽 시스템에 도달하면 선을 그립니다. DirectX와 같은 것을 조롱하는 것을 좋아하지 않습니다.

둘째, 메인 게임 루프 기능을 실제로 테스트하지는 않습니다. 합리적인 델타를 통과하면 모든 시스템이 작동하고 필요할 때 올바르게 작동하는지 테스트합니다. 그런 다음 게임 루프에서 각 시스템을 올바른 델타로 업데이트합니다. 실제로 각 시스템이 올바른 델타로 호출되었음을 보여주는 테스트를 할 수는 있지만 많은 경우에 (필요한 델타를 얻기 위해 복잡한 논리를 수행하지 않는 한 과잉이 아님) 과도한 것을 발견합니다.


6
첫 번째 단락이 핵심입니다. 사실 TDD를 사용하면 코드를 테스트하지 않고 코드를 더 잘 설계해야합니다. 물론 많은 사람들이 디자인 전문가라고 생각하지만, 자신의 기술에 가장 깊은 인상을받은 사람들은 대개 가장 많이 배우는 사람들입니다.
dash-tom-bang

2
결과적으로 코드가 더 잘 설계되었다는 데 동의하지 않습니다. 테스트 가능한 종속성을 주입하기 위해 이전에 깨끗한 인터페이스를 열어야하고 캡슐화가 끊어 져야하는 많은 가증을 보았습니다.
Kylotan

4
나는 다른 방법이 아닌 기존 클래스에 대해 테스트가 작성된 인스턴스에서 더 많이 발생한다는 것을 알았습니다.
Jeff

@Kylotan 아마도 부적절한 디자인 / 나쁜 테스트 디자인의 증상 일 것입니다. 깨끗한 테스트를 위해 모의 객체를 리팩토링하고 사용하십시오. 코드를 더 나쁜 상태로 해킹하지 마십시오. 그것은 일어날 일과 반대입니다.
timoxley

2
캡슐화는 좋은 것이지만 더 중요한 이유는 캡슐화가 좋은 이유를 이해하는 것입니다. 종속성과 큰 추악한 인터페이스를 숨기기 위해 그것을 사용한다면, 후드 아래의 디자인이 그리 좋지 않을 것입니다. 캡슐화는 기본적으로 못생긴 코드와 종속성을 숨기는 것이 아니라 코드를 쉽게 이해하고 소비자가 코드를 추론하려고 할 때 따라야 할 경로를 줄 이도록하는 것입니다.
Martin Odhelius

19

Noel Llopis는 여러분이 찾고 있다고 생각하는 정도까지 단위 테스트를 다루었습니다.

전체 게임 루프를 테스트하는 것과 관련하여 코드에서 기능적 회귀를 방지하는 또 다른 기술이 있습니다. 아이디어는 재생 시스템을 통해 게임 자체를 재생하는 것입니다 (즉, 먼저 플레이어 입력을 기록한 다음 다른 런을 통해 재생). 재생하는 동안 모든 프레임에 대한 각 객체 상태의 스냅 샷을 생성합니다. 이 상태 모음을 "골든 이미지"라고합니다. 코드를 리팩터링 할 때 다시 재생을 실행하고 각 프레임의 상태를 골든 이미지 상태와 비교하십시오. 다르면 테스트에 실패한 것입니다.

이 기술의 이점은 분명하지만 다음과 같이주의해야 할 사항이 있습니다.

  • 게임은 결정 론적이어야하므로 시스템 시계, 시스템 / 네트워크 이벤트, 결정적으로 시드되지 않은 난수 생성기에 따라주의를 기울여야합니다. 기타
  • 골든 이미지가 생성 된 후 컨텐츠가 변경되면 골든 이미지와 합법적 인 차이가 발생할 수 있습니다. 이 문제를 해결할 방법이 없습니다. 콘텐츠를 변경할 때 골든 이미지를 재생성해야합니다.

+1 또한이 방법의 가치는 "골든 이미지"의 길이와 직접적으로 관련이 있습니다. 충분히 길지 않으면 쉽게 버그를 놓칠 수 있습니다. 너무 길면 기다리게 될 것입니다. 이 모드에서는 일반적인 런타임 환경에서보다 시간을 단축시키기 위해 게임을 훨씬 빠르게 실행하는 것이 중요합니다. 렌더링을 건너 뛰면 도움이 될 수 있습니다!
엔지니어

9

나는 Jeff와 jpaver의 의견에 모두 동의합니다. 또한 아키텍처에 구성 요소 모델을 채택하면 테스트 가능성이 크게 증가한다고 덧붙였습니다. 구성 요소 모델을 사용하면 각 구성 요소는 단일 작업 단위를 수행해야하며 격리 된 상태에서 (또는 제한된 모의 객체로) 테스트 할 수 있어야합니다.

마찬가지로, 개체에 의존하는 게임의 다른 부분은 작동하기 위해 구성 요소의 하위 집합에만 의존해야합니다. 실제로 이것은 일반적으로 이러한 영역을 쉽게 테스트하기 위해 몇 가지 가짜 구성 요소를 조롱하거나 테스트 목적으로 부분 엔티티를 구성 할 수 있음을 의미합니다. 예를 들어, 렌더링 및 입력 컴포넌트는 물리 테스트에 필요하지 않기 때문에 생략합니다.

마지막으로, 인터페이스에 관해 게임 커뮤니티의 일부 사람들이 얻는 성능에 관한 조언을 무시하겠습니다. 인터페이스로 코드를 작성하고, 성능 문제가 발생하면 쉽게 프로파일 링, 식별 및 리팩토링하여 문제를 해결할 수 있습니다. 인터페이스의 성능 영향 또는 인터페이스의 복잡성 오버 헤드에 대한 Noel의 우려에 대해서는 설득력이 없었습니다.

즉, 모든 작은 것을 독립적으로 테스트하려고 시도하지 마십시오. 대부분의 테스트와 디자인은 올바른 균형을 유지하는 것입니다.


SX를 처음 사용하는 것 같지는 않지만 답변은 순서가 정해져 있지 않으며 "위의 의견 둘 다"와 같은 말은 현재 더 이상 사용되지 않습니다. 현재 다른 두 가지 답변 중 하나입니다. :)
Ricket

고마워, 나는 논평하는 동안 그것에 대해 생각하지 않았다. 이후 개별 의견을 선택하기 위해 의견을 업데이트했습니다.
Alex Schearer

3

사용자가 단위 테스트를 대체 할 수 있다는 OP의 의견에 응답하는 두 번째 답변을 추가 할 것이라고 생각했습니다. 단위 테스트의 목적이 품질을 보장하지 않기 때문에 이것이 완전히 잘못되었다고 생각합니다. 프로그램의 품질을 보장하기 위해 테스트를 실시하려면 시나리오 테스트를 조사하거나 훌륭한 모니터링에 투자해야합니다.

(모니터링 및 서비스로 실행되는 제품을 사용하면 실제로 "테스트"를 고객에게 푸시 할 수 있지만 오류를 신속하게 감지하고 변경 사항을 롤백하는 정교한 시스템이 필요합니다. 소규모 개발팀.)

단위 테스트의 주요 이점은 개발자가 더 나은 코드를 작성하도록 강요한다는 것입니다. 테스트는 개발자가 우려 사항을 분리하고 데이터를 캡슐화하도록 요구합니다. 또한 개발자가 인터페이스와 다른 추상화를 사용하여 한 가지만 테스트하도록 권장합니다.


단위 테스트는 개발자가 좋은 코드를 작성하도록 강요하지 않는다는 점을 제외하고 동의합니다. 또 다른 옵션이 있습니다 : 정말로 잘못 작성된 테스트. 코더의 단위 테스트에 대한 약속이 필요합니다.
tenpn

2
물론 그렇다고해서 목욕물로 아기를 버릴 이유는 없습니다. 책임감있게 도구를 사용하지만 먼저 도구를 사용하십시오.
Alex Schearer 21:40에
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.