C ++ 기반 게임을위한 어떤 단위 테스트 프레임 워크? [닫은]


13

어떤 테스트 도구 조합이 가장 좋다고 생각하십니까? 선택한 프레임 워크 / 라이브러리가 주어지면 다음을 고려할 수 있습니다.


참고 : 이것은 잠재적 으로 SO 와 같은 일반적인 질문이지만 게임 개발은 일반적으로 테스트 선택에 영향을 미치는 특정 작업 흐름에 묶여 있다고 주장합니다. 더 높은 수준의 관점을 보려면 자동 게임 테스트 질문을 참조하십시오 .


이 질문에 어떤 문제도 직접 보지 않지만 Community Wiki로 만들면 도움이 될 것입니다. 예 : gamedev.stackexchange.com/questions/480/…
Jesse Dorsey

CW로 만들었습니다. 그러나 CW에 대해 언제 질문해야하는지에 대한 가이드 라인은 초보자에게 특히 불분명 해 보입니다. 특히 이것이 일반적으로 논의되기 때문에 ( meta.stackexchange.com/questions/55888 ). FAQ에서 gamedev 정책을 명시 적으로 명시 할 수 있습니까?
jmp97

답변:


7

UnitTest ++ 는 작업하기가 매우 쉽다는 것을 알았 습니다. 아직 모의 객체 기능을 위해 UnitTest ++의 좋은 동반자로 언급 된 amop 을 시도 해야 합니다. 그렇지 않으면 Google Mock 이 많이 사용됩니다. 또한 UnitTest ++ 및 Mock Objects 에서 읽을 수 있습니다 .

UnitTest ++는 Hudson과 같은 Continuous Integration 접근 방식으로 설정할 수 있습니다

단위 테스트와 게임이 잘 어울린다고 확신하지 못하면 이 영감을주는 게시물 을 읽어보십시오 .


UnitTest ++는 특히 수정하고 확장하기 쉽다는 점에서 필요한 유일한 테스트 프레임 워크입니다. 나중에 Java 프로그래밍을하고있는 경우 JUnit은 표시되는 완전하지 않은 우아함이있는 망치로 얼굴을 반복해서 공격합니다.
dash-tom-bang

UnitTest ++의 경우 github.com/unittest-cpp/unittest-cpp로 이동하십시오. 다른 모든 것이 오래되었습니다.
Markus

4

UnitTest ++에 대한 또 다른 투표 . 통합이 매우 쉽고 대상 임베디드 플랫폼 용으로 매우 쉽고 간단하며 사용하기 쉽게 컴파일되었습니다. 우리는 또한 그것을 Hudson과 통합했습니다. GoogleTest를 보았지만 거부했습니다 (타겟 플랫폼에서 컴파일하는 데 문제가 있다고 생각합니다). 비슷한 기능 세트를 가지고 있으며 귀하에게 적합 할 수 있습니다.

또한 어떤 종류의 연기 테스트 프레임 워크를 살펴볼 수도 있습니다. 내 경험상 단위 테스트만으로 게임에 충분한 테스트 범위를 얻는 것은 어렵습니다. 특히 기존 코드베이스에 단위 테스트를 도입하고 있다면 대규모 팀을 위해 더 많은 것을 제공합니다. 연기 테스트는 "모든 레벨이로드되는지 확인"과 같은 고급 항목을 테스트하는 것입니다. 나의 이론은 만약 내가 두 종류의 테스트를한다면 어느 시점에서 그들은 중간에서 만나 적절한 수렴을 할 수 있다는 것이다. :)


2

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);
}

(위의 코드에서, csod모듈 별 일정하고, TestCommand모의 목적이다.)



2

저는 전문 게임 개발자는 아니지만 전문 임베디드 개발자입니다. 아마도 게임을 좋아하지는 않지만 가깝습니다. 직장에서 우리는 몇 가지를 사용했습니다.

나는 구글 테스트를 정말로 좋아한다 . 최신 단위 테스트 프레임 워크의 최상의 기능을 모두 갖춘 동시에 최소한의 유선 인터페이스로 유지합니다.

내 목록의 다음은 Boost Test 입니다. 구글 테스트의 API는 Boost.Test보다 약간 현대적이지만 Boost Test는 새로운 기능을 추가하고 CppUnit 패러다임을 버리는 놀라운 일을 해냈습니다.

CxxTest 도 사용 했습니다 . 잘 수행되었지만 Boost.Test 또는 Google Test만큼 현대적이지 않다는 것을 알 수 있습니다. 특히 테스트 스위트 및 픽스처에 대한 지원은 다소 어색하다.

나는 고급 기능을 사용하고 싶지만 미니멀리스트라면 세 가지의 차이점을 결코 볼 수 없습니다. 대부분의 동료들은 자동 등록 테스트 (선언적 방식으로)를 지원하고 일종의 CHECK_EQUALS (a, b) 매크로가있는 단위 테스트 프레임 워크에 만족합니다.


1

내가 가장 좋아하는 테스트 라이브러리는 QuickCheck http://en.wikipedia.org/wiki/QuickCheck 입니다. 실험적인 C ++ 버전이 있지만 너무 무거워 보이지만 전용 라이브러리가 없어도 원칙을 쉽게 사용할 수 있습니다.

모든 클래스에는 임의 인스턴스를 생성 할 수있는 genArbitrary 메소드가 있습니다. 나는 이것을 로딩 및 언 로딩과 같은 연기가없는 과정의 연기 테스트에 사용합니다. 수천 개의 임의 장면을 생성하고 다양한 속성이 유지되는지 확인할 수 있습니다 (직렬화하는 장면이 역 직렬화되는 장면과 동일 함).

전통적인 단위 테스트를 대체하지는 않지만 (많은 잠재적 인 단위 테스트의 필요성을 줄입니다), 버그를 발견하는 좋은 방법이며, 메모리 할당 전략 (Valgrind와 함께)을 스트레스 테스트하는 데 도움이됩니다. Valgrind가 백만 개가 넘는 할당량을 보는 것이 좋습니다 :).

나는 CxxTest를 테스트 하네스로 사용했었다. 이제 내 모든 테스트는 별도의 exe입니다. Test라는 폴더가 있고 Test_로 시작하는 파일이 테스트가됩니다. 지금까지는 테스트하기가 매우 쉽습니다.


0

Java에는 훌륭한 라이브러리가 많이 있습니다. C ++의 경우는 아닙니다.

C ++ 사용자에게는 Kitware의 체인 도구가 매우 흥미 롭습니다.

  • CMake : 도구 만들기
  • CDash : 지속적인 통합 도구

Kitware는 컴퓨터 과학을위한 C ++ 코드를 작성합니다.

개인 프로젝트의 경우 Boost 단위 테스트 라이브러리 (데스크톱 플랫폼)를 사용합니다. 지속적인 통합을 위해 허드슨을 사용합니다.

  • Tomcat에 쉽게 설치
  • 스크립트 가능

0

두 번째로 TUT (Template Unit Test) 프레임 워크를 설명 하겠습니다 . 매우 가볍고 유연성이 뛰어나 설치 및 사용이 매우 쉽습니다 (단일 헤더, 약간의 주 / 설정 코드 및 24 줄의 테스트 코드가 나중에 단위 테스트를 포함 함). 임베디드 소프트웨어 개발을 포함하여 신속한 프로토 타입 / TDD / 학습 템플릿을 위해 binfmtc (스크립트로 C ++ 프로그램 실행) 와 결합했습니다 . XML로 출력 할 수 있기 때문에 Jenkins (CI) 및 Sonar와의 연속적인 프로젝트에 능숙했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.