어떤 테스트 도구 조합이 가장 좋다고 생각하십니까? 선택한 프레임 워크 / 라이브러리가 주어지면 다음을 고려할 수 있습니다.
참고 : 이것은 잠재적 으로 SO 와 같은 일반적인 질문이지만 게임 개발은 일반적으로 테스트 선택에 영향을 미치는 특정 작업 흐름에 묶여 있다고 주장합니다. 더 높은 수준의 관점을 보려면 자동 게임 테스트 질문을 참조하십시오 .
어떤 테스트 도구 조합이 가장 좋다고 생각하십니까? 선택한 프레임 워크 / 라이브러리가 주어지면 다음을 고려할 수 있습니다.
참고 : 이것은 잠재적 으로 SO 와 같은 일반적인 질문이지만 게임 개발은 일반적으로 테스트 선택에 영향을 미치는 특정 작업 흐름에 묶여 있다고 주장합니다. 더 높은 수준의 관점을 보려면 자동 게임 테스트 질문을 참조하십시오 .
답변:
UnitTest ++ 는 작업하기가 매우 쉽다는 것을 알았 습니다. 아직 모의 객체 기능을 위해 UnitTest ++의 좋은 동반자로 언급 된 amop 을 시도 해야 합니다. 그렇지 않으면 Google Mock 이 많이 사용됩니다. 또한 UnitTest ++ 및 Mock Objects 에서 읽을 수 있습니다 .
UnitTest ++는 Hudson과 같은 Continuous Integration 접근 방식으로 설정할 수 있습니다
단위 테스트와 게임이 잘 어울린다고 확신하지 못하면 이 영감을주는 게시물 을 읽어보십시오 .
UnitTest ++에 대한 또 다른 투표 . 통합이 매우 쉽고 대상 임베디드 플랫폼 용으로 매우 쉽고 간단하며 사용하기 쉽게 컴파일되었습니다. 우리는 또한 그것을 Hudson과 통합했습니다. GoogleTest를 보았지만 거부했습니다 (타겟 플랫폼에서 컴파일하는 데 문제가 있다고 생각합니다). 비슷한 기능 세트를 가지고 있으며 귀하에게 적합 할 수 있습니다.
또한 어떤 종류의 연기 테스트 프레임 워크를 살펴볼 수도 있습니다. 내 경험상 단위 테스트만으로 게임에 충분한 테스트 범위를 얻는 것은 어렵습니다. 특히 기존 코드베이스에 단위 테스트를 도입하고 있다면 대규모 팀을 위해 더 많은 것을 제공합니다. 연기 테스트는 "모든 레벨이로드되는지 확인"과 같은 고급 항목을 테스트하는 것입니다. 나의 이론은 만약 내가 두 종류의 테스트를한다면 어느 시점에서 그들은 중간에서 만나 적절한 수렴을 할 수 있다는 것이다. :)
C ++ (면책 조항 : 약 2005 년)에서 일할 때 약간 수정 된 TUT (Template Unit Test Framework) 버전을 사용했습니다 . 너무 가벼워서 수정하기 쉬워 테스트를 작성할 때 "접착제"가 거의 필요하지 않기 때문에 마음에 들었습니다.
여기에 내가 만든 매우 간단한 수정 사항이 있습니다. 테스트를 작성하기가 더 쉬워졌습니다.
static int BogusFunction() { return __COUNTER__; } // Increment the __COUNTER__ to the correct position for the begining of the tests
#define TEST template<> template<> void object::test<__COUNTER__>()
#define ENSURE(msg, cond) ensure(msg, cond, __FILE__, __LINE__)
#define ENSURE_EQUALS(msg, actual, expected) ensure_equals(msg, actual, expected, __FILE__, __LINE__)
#define ENSURE_DISTANCE(msg, actual, expected, distance) ensure_distance(msg, actual, expected, distance, __FILE__, __LINE__)
#define FAIL(msg) fail(msg, __FILE__, __LINE__)
내가 만든 또 다른 변경 사항은 출력 형식으로 변경되었으므로 테스트 실패가 Visual Studio의 오류 목록 (빌드의 일부로 실행될 때)에 올바르게 표시되고 클릭하여 실패한 테스트의 파일과 행으로 이동합니다.
(이런 종류의 작업을 수행 할 수 있다는 것은 TDD / CI 프로세스에 적합하게 만들지 않고 TDD / CI 프로세스에 맞게 만들 수 있음을 의미합니다 .)
다음은 테스트 예제입니다 (내 편집기의 명령 스택에서).
TEST // Undoing a command
{
cs.AddCommand(new TestCommand);
cs.AddCommand(new TestCommand(od));
ENSURE("Undo success", cs.Undo());
ENSURE_EQUALS("Stack size", cs.size(), 2);
ENSURE_EQUALS("Command's Undo() was called", od.undo, 1);
ENSURE_EQUALS("Command's Redo() not called", od.redo, 0);
ACommandStack::const_iterator it = cs.end();
ENSURE("Command is redoable", cs.GetUndoPos() == --it);
}
(위의 코드에서, cs
및 od
모듈 별 일정하고, TestCommand
모의 목적이다.)
C ++에 관해서는 googletest 프레임 워크 ( http://code.google.com/p/googletest/)를 사용해 보았습니다 . 설정이 간단하고 사용하기 쉬우 며 훌륭하게 작동합니다.
저는 전문 게임 개발자는 아니지만 전문 임베디드 개발자입니다. 아마도 게임을 좋아하지는 않지만 가깝습니다. 직장에서 우리는 몇 가지를 사용했습니다.
나는 구글 테스트를 정말로 좋아한다 . 최신 단위 테스트 프레임 워크의 최상의 기능을 모두 갖춘 동시에 최소한의 유선 인터페이스로 유지합니다.
내 목록의 다음은 Boost Test 입니다. 구글 테스트의 API는 Boost.Test보다 약간 현대적이지만 Boost Test는 새로운 기능을 추가하고 CppUnit 패러다임을 버리는 놀라운 일을 해냈습니다.
CxxTest 도 사용 했습니다 . 잘 수행되었지만 Boost.Test 또는 Google Test만큼 현대적이지 않다는 것을 알 수 있습니다. 특히 테스트 스위트 및 픽스처에 대한 지원은 다소 어색하다.
나는 고급 기능을 사용하고 싶지만 미니멀리스트라면 세 가지의 차이점을 결코 볼 수 없습니다. 대부분의 동료들은 자동 등록 테스트 (선언적 방식으로)를 지원하고 일종의 CHECK_EQUALS (a, b) 매크로가있는 단위 테스트 프레임 워크에 만족합니다.
내가 가장 좋아하는 테스트 라이브러리는 QuickCheck http://en.wikipedia.org/wiki/QuickCheck 입니다. 실험적인 C ++ 버전이 있지만 너무 무거워 보이지만 전용 라이브러리가 없어도 원칙을 쉽게 사용할 수 있습니다.
모든 클래스에는 임의 인스턴스를 생성 할 수있는 genArbitrary 메소드가 있습니다. 나는 이것을 로딩 및 언 로딩과 같은 연기가없는 과정의 연기 테스트에 사용합니다. 수천 개의 임의 장면을 생성하고 다양한 속성이 유지되는지 확인할 수 있습니다 (직렬화하는 장면이 역 직렬화되는 장면과 동일 함).
전통적인 단위 테스트를 대체하지는 않지만 (많은 잠재적 인 단위 테스트의 필요성을 줄입니다), 버그를 발견하는 좋은 방법이며, 메모리 할당 전략 (Valgrind와 함께)을 스트레스 테스트하는 데 도움이됩니다. Valgrind가 백만 개가 넘는 할당량을 보는 것이 좋습니다 :).
나는 CxxTest를 테스트 하네스로 사용했었다. 이제 내 모든 테스트는 별도의 exe입니다. Test라는 폴더가 있고 Test_로 시작하는 파일이 테스트가됩니다. 지금까지는 테스트하기가 매우 쉽습니다.
두 번째로 TUT (Template Unit Test) 프레임 워크를 설명 하겠습니다 . 매우 가볍고 유연성이 뛰어나 설치 및 사용이 매우 쉽습니다 (단일 헤더, 약간의 주 / 설정 코드 및 24 줄의 테스트 코드가 나중에 단위 테스트를 포함 함). 임베디드 소프트웨어 개발을 포함하여 신속한 프로토 타입 / TDD / 학습 템플릿을 위해 binfmtc (스크립트로 C ++ 프로그램 실행) 와 결합했습니다 . XML로 출력 할 수 있기 때문에 Jenkins (CI) 및 Sonar와의 연속적인 프로젝트에 능숙했습니다.