test que español ejemplo driven development atdd unit-testing tdd

unit testing - que - ¿Cómo organizas tus pruebas unitarias en TDD?



tdd wikipedia (5)

Divide tus pruebas en 2 sets:

  • pruebas funcionales
  • pruebas de unidades

Las pruebas funcionales son historia por usuario. Las pruebas unitarias son por clase. El primero comprueba que usted realmente apoya la historia, este último ejercicio y documenta su funcionalidad.

Hay un directorio (paquete) para pruebas funcionales. Las pruebas unitarias deben estar estrechamente vinculadas con la funcionalidad que ejercen (por lo que están dispersas). Los mueves y los refactorizas mientras te mueves y refactorizas tu código.

Hago TDD, y he sido bastante flexible en la organización de mis pruebas unitarias. Tiendo a comenzar con un archivo que representa la siguiente historia o fragmento de funcionalidad y escribo todas las pruebas unitarias para que funcione.

Por supuesto, si presento una nueva clase, generalmente hago un módulo o archivo de prueba de unidad para esa clase, pero no organizo las pruebas en una estructura de nivel superior. El resultado es que escribo el código rápidamente y creo que mi programa real está razonablemente bien estructurado, pero las pruebas de la unidad en sí son "desordenadas". Especialmente, su estructura tiende a recapitular la filogenia del proceso de desarrollo. A veces me veo como comerciando la pereza en el código de la pereza en las pruebas.

¿Qué tan grande es este problema? ¿Quién aquí continuamente refactoriza y reorganiza sus pruebas unitarias para tratar de mejorar su estructura general? ¿Algún consejo para esto? ¿Cómo debería ser la estructura general de las pruebas?

(Tenga en cuenta que no estoy tanto preguntando la pregunta "cuántas afirmaciones por función" se hacen aquí: ¿Cuántas pruebas unitarias debo escribir por función / método? Estoy hablando de la imagen más grande).


Escribo una clase de prueba unitaria para cada clase en la aplicación, y mantengo las clases de prueba organizadas en la misma estructura de paquete que las clases bajo prueba.

Dentro de cada clase de prueba, realmente no tengo mucha estructura organizacional. Cada uno solo tiene un puñado de métodos para cada método público en la clase bajo prueba, por lo que nunca he tenido ningún problema para encontrar lo que estoy buscando.


Intento ver las pruebas unitarias como un proyecto en sí mismas. Como con cualquier proyecto, la organización debe seguir cierta lógica interna. Sin embargo, no tiene que ser específico ni formalmente definido: cualquier cosa con la que se sienta cómodo está bien, siempre que mantenga su proyecto bien organizado y limpio.

Entonces, para las pruebas unitarias generalmente sigo la estructura del código del proyecto principal o (en ocasiones, cuando la situación lo requiera), en cambio, me concentro en las áreas funcionales.

Dejándolos en un montón es como se puede imaginar desordenado y difícil de mantener


La parte menos importante es organizar las pruebas.

Comienzo colocando las pruebas en una clase que se relaciona con la clase bajo prueba, por lo que com.jeffreyfredrick.Foo tiene una prueba com.jeffreyfredrick.FooTest. Pero si algún subconjunto de esas clases necesita una configuración diferente, entonces las moveré a su propia clase de prueba. Puse mis pruebas en un directorio de origen separado pero las mantuve en el mismo proyecto.

La parte más importante es refactorizar las pruebas.

Sí, intento y refactorizar mis pruebas a medida que avanzo. El objetivo es eliminar la duplicación sin dejar de ser declarativo y fácil de leer. Esto es cierto tanto dentro de las clases de prueba como en las clases de prueba. Dentro de una clase de prueba podría tener un método parametrizado para crear una prueba falsa (simulacro o stub). Mis falsificaciones de prueba generalmente son clases internas dentro de una clase de prueba, pero si encuentro que hay necesidad, las sacaré para su reutilización en todas las pruebas. También crearé una clase TestUtil con métodos comunes cuando parezca apropiado.

Creo que la refacturación de sus pruebas es importante para el éxito a largo plazo de las pruebas unitarias en proyectos grandes. ¿Alguna vez escuchó a personas quejarse de que sus exámenes son demasiado frágiles o que les impiden cambiar? No quiere estar en una posición en la que cambiar el comportamiento de una clase signifique realizar docenas o incluso cientos de cambios en sus pruebas. Y al igual que con el código, lo logra mediante la refactorización y la limpieza de las pruebas.

Las pruebas son código.


Para cada clase en el software, mantengo una clase de prueba de unidad. Las clases de prueba de unidades siguen la misma jerarquía de paquetes que las clases que se prueban.

Mantengo mi código de prueba de unidad en un proyecto separado. Algunas personas también prefieren mantener su código de prueba en el mismo proyecto en un directorio de origen separado llamado ''prueba''. Podrías seguir lo que te resulte cómodo.