2010-07-24 10 views
6

Quiero intentar implementar el Juego Tetris usando TDD.Pruebas de aceptación para Tetris cuando se usa Desarrollo controlado por prueba

Por lo que he entendido al leer Growing Object-Oriented Software, Guided by Tests, debería comenzar por definir cuáles serían mis pruebas de aceptación. Si estoy en lo cierto, las pruebas de aceptación cuando se hace TDD se definen como casos de uso.

Es de gran importancia definir una buena primera prueba de aceptación que funcione como "esqueleto" de la aplicación, por lo que debería ser algo simple.

que he elegido los siguientes 2 Pruebas de Aceptación como mi primer implementar:

  1. se inicia el juego y el jugador lo cierra.
  2. Comienza el juego y el jugador no hace nada. Él eventualmente pierde.

¿Son estas 2 pruebas de aceptación buenas pruebas de inicio? ¿Cuáles serían las próximas pruebas de aceptación? Podría pensar en algo así como

  • El juego comienza y solo caen las piezas cuadradas. El jugador los coloca a todos de manera tal que las líneas siempre "explotan", haciendo que el Juego después de 100 pasos del juego aún no haya terminado.

pero siento que esto es un poco incómodo, ya que en un juego real de Tetris siempre tendrías diferentes piezas cayendo, y de eso se trata la Prueba de Aceptación.

Además, me siento un poco tentado de solo intentar implementar todo de una sola vez al hacer (2), que creo que no es el mismo cuando se implementa la segunda Prueba de aceptación. Supongo que la idea sería implementar el juego solo después de como 6-7 de ellos, no en el segundo. ¿Estoy en lo cierto?

Gracias

Respuesta

3

Pensaré primero en el campo de juego y en cómo se ve después de que se hayan eliminado varios cuadros con algunos bloques definidos. Por ejemplo, usando 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 

Si te gusta el aspecto de pepino característica especificaciones, es posible que desee probar Cuke4Nuke para .Net o Cuke4Duke para Java.

+0

No tengo claro de dónde proviene el número 48. Además, para el segundo escenario, ¿debería la frase dada ser "Dado un campo completo de 10x2" en su lugar? – SCFrench

+0

Miré la página de Wikipedia para Tetris para obtener el lenguaje comercial. De ahí es de donde vinieron los 48. "un campo completo de 10x2" podría ser una buena opción, pero no muy realista, he jugado un poco de Tetris en mi tiempo y NUNCA he visto un campo completo. –

+0

Tengo algunos problemas para entender cómo usar TDD, que dice que para cada prueba deberíamos tener la cantidad mínima de código posible para hacer funcionar algo, en caso de que implementemos los escenarios que nos proporcionó. Quiero decir, podría implementar ya el juego completo de tetris, pero es difícil para mí concebir cómo implementar exactamente lo que se necesita sin tener que ponerlo todo allí. –

0

Comience con una simple lista de bloques. Asumiendo que no hay jugador, los bloques se acumularán de cierta manera y luego se derramarán. Su prueba falla si los bloques no se acumulan correctamente o si el programa no detecta el derrame.

+0

¿Cómo puedo saber que no se acumulan correctamente? ¿No tendría que implementar una lógica de código más compleja que la que estoy tratando de hacer? ¿O supones que acabo de aterrizar en el juego un conjunto de piezas elegidas? ¿Estás hablando de Pruebas Unitarias o Pruebas de Aceptación? –

+0

Supuse un conjunto de piezas elegidas. – emory

2

Querrá eliminar de sus pruebas la aleatoriedad que pertenece a su juego. Sí, esto significa que la prueba no duplica perfectamente el juego, pero también significa que tiene pruebas repetibles, y eso es de mayor valor. Aísle las diferencias: pase un PieceProvider a su juego; para el juego real pasa un RandomPieceProvider, pero para las pruebas pasa en un SpecifiedPieceProvider. Ahora solo tienes una pequeña diferencia entre ellos, pero la diferencia debería ser tan pequeña como para no importar; aún puedes probar todos los demás aspectos del juego con confianza.

+0

El constructor 'public Random (long seed)' hace que sea fácil crear una prueba repetible pero plausible: http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/api/java/util/ Random.html – trashgod

+0

Sí, eso es cierto. Pero lo que más me molesta es cómo implementar el primer escenario/caso de uso. La pregunta es cuánto debería implementar del juego en sí. –

+0

@devoured No he leído el libro que mencionas, pero la mayoría de los consejos que he visto con respecto a TDD son: solo lo suficiente para aprobar el examen. Me ha funcionado bien. –

Cuestiones relacionadas