2010-09-28 18 views
18

Estoy escribiendo casos de prueba de unidad para un juego en el que estoy trabajando. Cuando se inicia el juego, el jugador está colocado al azar, y tengo dos problemas con eso:Unidad probando un método con comportamiento aleatorio

  1. Dado que el jugador se coloca al azar, no puedo estar seguro de que un caso de prueba que pasa una vez pasará de nuevo. Por ejemplo, podría pasar la mayor parte del tiempo, pero fallará si el jugador está colocado delante de un obstáculo.
  2. Tengo que probar todas las situaciones en un caso de prueba. Por ejemplo, cuando pruebo si el jugador se mueve correctamente, debo verificar si hubo un obstáculo y si fue considerado por el algoritmo.

No estoy muy contento con eso, pero no veo una salida. ¿Es aceptable probar métodos con comportamiento parcialmente aleatorio?

+0

Posible duplicado de [Unidad probando un método que puede tener un comportamiento aleatorio] (https://stackoverflow.com/questions/88007/unit-testing-a-method-that-can-have-random-behaviour) –

Respuesta

23

Le sugiero que trate su fuente de aleatoriedad (un generador de números aleatorios o lo que sea) como una dependencia. Luego puede probarlo con entradas conocidas proporcionando un RNG falso o uno con una simiente conocida. Eso elimina la aleatoriedad de la prueba, manteniéndola en el código real.

Si falsifica el RNG, puede probar lo que sucedería si colocara al jugador de forma natural en un obstáculo: cómo mueve al jugador fuera del camino, etc. Por supuesto, eso depende de saber cómo utiliza la clase el RNG , pero personalmente estoy feliz de que las pruebas unitarias actúen como "pruebas de caja blanca" con algún conocimiento interno.

+0

Entonces eso significa que sugieres que suministre mi juego con un generador de números aleatorios del cual puedo crear una implementación simulada. – forceal

+0

@forceal: Sí, eso es correcto. –

+0

Hm. Pero el generador de números aleatorios se usaría para varias cosas, por lo que sería muy difícil falsificarlo. Por ejemplo, también se usa para el color del jugador (algo que no tiene influencia en ningún otro aspecto del juego, así que lo ignoro). La única forma que veo es crear una clase de generador que contenga métodos como "getRandomPlayerPosition()" y "getRandomPlayerColor()", entonces podría fingirlo. ¿Estaría bien? – forceal

5

Un enfoque que puede tomar es dividir la generación de posición aleatoria en una clase/interfaz separada, para que pueda anularla en su prueba y, por lo tanto, controlarla.

3

Haga de la fuente de aleatoriedad una entrada para la prueba, y configúrela para que sea la misma cada vez.

Casi todos los generadores de números aleatorios toman un valor de "semilla". Al proporcionar el mismo valor inicial cada vez, puede saber que obtendrá la misma secuencia de números aleatorios y, por lo tanto, el resultado de su aplicación debería ser exactamente el mismo.

Tengo que probar todas las situaciones en un caso de prueba.

¿Por qué? Puede tener múltiples casos de prueba. Puede elegir cualquier número de semillas de números aleatorios diferentes y arbitrarios para crear las condiciones que desea probar. O simplemente reemplace el posicionamiento aleatorio con un posicionamiento específico para los propósitos de la prueba.

1

Hay dos cosas diferentes para probar aquí, y usted debe probar por separado:

  • ¿Funciona la lógica del programa para todas las posibles posiciones de partida? Pruebe esto colocando el jugador no randomy en varias posiciones, tratando de cubrir todos los "casos especiales".
  • ¿El posicionamiento aleatorio es realmente aleatorio? Pruebe esto llamando solo a la lógica de posicionamiento muchas veces, y haga algún tipo de análisis estadístico.
0

Según la teoría de la prueba que no es posible probar el comportamiento al azar :) Por otra parte, como en las respuestas anteriores, dijo, para las pruebas que usted podría hacer actividades pseudo-aleatorios de alguna manera.

1

Como han dicho otras respuestas, los algoritmos aleatorios son deterministas. puedes reproducir una secuencia si usas la misma semilla.

Las únicas situaciones en las que tuve que tratar con un código no determinista, es cuando estaba involucrado el multihilo. Entonces, depende del planificador del sistema operativo.

En esos casos, escribo la unidad de prueba como un bucle, que se repite miles de veces el código de prueba.

Cuestiones relacionadas