2010-07-24 3 views
6

TDD를 사용하여 테트리스 게임을 구현하려고합니다.테스트 주도 개발을 사용할 때 테트리스에 대한 수락 테스트

Growing Object-Oriented Software, Guided by Tests을 읽었을 때 내가 이해할 수있는 것으로부터, 나는 수락 테스트가 무엇인지 정의해야합니다. 내가 맞다면, TDD를 할 때 Acceptance tests는 Use Cases와 같이 정의됩니다.

앱의 "해골"로 작동 할 수있는 우수한 수락 테스트를 정의하는 것이 매우 중요하므로 간단해야합니다.

나는 구현하기 위해 처음으로 다음이 개 입학 시험을 선택이 끝난했습니다

  1. 게임의 시작과 플레이어를 닫습니다.
  2. 게임이 시작되고 플레이어가 아무 것도하지 않습니다. 그는 결국 잃는다.

이 2 가지 인수 테스트는 좋은 테스트입니까? 다음에 받아 들여지는 테스트는 무엇이 좋을까요? 나는 무엇이든을 생각할 수 있었다

  • 게임은 시작하고 정사각형 조각 만 떨어 뜨린다. 플레이어는 줄을 항상 "폭발"시키므로 100 개의 게임 단계가 끝난 후에도 게임을 끝내게 만듭니다.

그러나 나는 이것이 진짜 테트리스 게임에서 당신이 항상 떨어지는 다른 조각을 가지고있는 것처럼 어색하다고 느낍니다. 그것은 받아 들일 시험이 있어야하는 것입니다.

또한 (2)를 할 때 한 번에 모든 것을 구현하려고하는 유혹을 느낍니다. 두 번째 수락 테스트를 구현할 때 하나도 가장하지 않는다고 생각합니다. 내 생각에 그 게임은 6-7 세 이후에 구현 된 것일뿐 두 번째 게임에서는 구현되지 않습니다. 내가 맞습니까?

감사합니다.

답변

3

나는 게임 필드에 대해 먼저 생각해 볼 것이고, 정의 된 블록이 몇 개있는 프레임이 여러 개 나오면 어떻게 생겼는지 생각할 것입니다. Cucumber를 사용하여 예를 들면 : 당신이 오이의 기능 사양의 모양을 좋아하는 경우에

Scenario: dropping the first square 
    Given an empty 10x2 field 

    When a square is dropped at column 4 
    And 48 frames have passed 

    Then the field should contain a square at (4, 1) 

    When 48 frames have passed 
    Then the field should contain a square at (4, 2) 

Scenario: Dropping a square on a full stack 
    Given an empty 10x2 field 
    And a square at (4, 2) 

    When a square is dropped at column 4 
    And 48 frames have passed 

    Then the game should be over 

, 당신은 자바 닷넷에 대한 Cuke4Nuke 또는 Cuke4Duke을 시도 할 수도 있습니다.

+0

번호 48의 출처가 확실하지 않습니다. 또한 두 번째 시나리오에서 주어진 구문은 "전체 10x2 필드 제공"이되어야합니까? – SCFrench

+0

비즈니스 언어를 사용하기 위해 테트리스에 대한 Wikipedia 페이지를 살펴 보았습니다. 그것은 48 명이 나온 곳입니다. "완전한 10x2 필드"는 훌륭하지만 아주 현실적이지는 않습니다. 저는 테트리스를 약간의 시간 내내 연주했고, 전 분야를 결코 보지 못했습니다. –

+0

TDD를 사용하는 방법을 이해하는 데 어려움이 있습니다. 테스트마다 코드를 실행할 수있는 최소한의 코드 만 있으면됩니다. 사용자가 지정한 시나리오를 구현해야합니다. 이미 테트리스 게임을 완벽하게 구현할 수는 있지만 이미 모든 것을 넣지 않고도 필요한 것을 구현하는 방법을 생각하기가 어렵습니다. –

0

간단한 블록 목록으로 시작하십시오. 플레이어가 없다고 가정하면 블록이 특정 방식으로 쌓여서 엎질러집니다. 블록이 쌓이지 않거나 프로그램이 스필 오버를 감지하지 못하면 테스트가 실패합니다.

+0

어떻게해야 제대로 알 수 있습니까? 내가 만든 코드 로직보다 복잡한 코드 로직을 구현해야하지 않을까요? 아니면 내가 선택한 곡들을 게임에 착륙 시켰다고 가정하고 있니? Unit Tests 또는 Acceptance Tests에 대해 이야기하고 있습니까? –

+0

나는 선택한 조각들을 추측했다. – emory

2

테스트에서 게임에 포함 된 임의성을 제거하고 싶습니다. 예, 테스트가 게임을 완벽하게 복제하지는 않지만 반복 테스트가 있다는 것을 의미합니다. 이는 더 큰 가치입니다. 차이점을 분리하십시오 - PieceProvider를 게임에 전달하십시오. 실제 게임은 RandomPieceProvider를 패스하지만, 테스트의 경우 SpecifiedPieceProvider를 통과합니다. 이제 당신은 그것들 사이에 약간의 차이가 있습니다 만, 차이는 중요하지 않은만큼 작아야합니다. 당신은 여전히 ​​자신감을 갖고 게임의 다른 모든 측면을 테스트 할 수 있습니다.

+0

'public Random (long seed)'생성자를 사용하면 반복 가능하지만 그럴듯한 테스트를 쉽게 만들 수 있습니다. http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/api/java/util/ Random.html – trashgod

+0

네, 맞습니다. 하지만 나를 괴롭히는 것은 첫 번째 시나리오/유스 케이스를 구현하는 방법입니다. 문제는 게임 자체를 얼마나 구현해야하는지입니다. –

+0

@devoured 내가 언급 한 책을 읽지는 못했지만 TDD와 관련하여 본 조언의 대부분은 테스트를 통과하기에 충분합니다. 그것은 나를 위해 잘 작동했습니다. –

관련 문제