2008-09-30 15 views
23

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.¿Cómo organizas tus pruebas unitarias en TDD?

Por supuesto, si estoy presentando una nueva clase, normalmente 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 haciendo la pregunta "¿cuántas afirmaciones por función" preguntó aquí:. How many unit tests should I write per function/method? Estoy hablando de la imagen más grande)

+4

"recapitula la filogenia"? Guau. –

+7

@OAB: "Wow" no es la palabra que usaría. Soy tan fanático de la palabra sesquipedal como el próximo tipo, pero eso es simplemente grandioso. – raven

Respuesta

12

dividir sus pruebas en 2 series:

  • pruebas funcionales
  • unidades de pruebas

Funcional las pruebas 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). Usted los mueve y los refactoriza mientras mueve & refactorice su código.

3

escribo una clase de prueba para cada unidad clase en la aplicación, y mantener 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 organizativa. 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.

+0

¿Cómo se mantienen organizadas las pruebas en la misma estructura de paquete que las clases bajo prueba? Encuentro que no puedo continuar con la refactorización de las clases bajo prueba si intento hacer esto. –

+2

@PeterAjtai Mi IDE (Eclipse) en parte se ocupa de esto por mí. Tengo una carpeta de origen y una carpeta de prueba de root por separado. Cada uno de ellos tiene las mismas carpetas de paquetes dentro. Cuando hago clic con el botón derecho en una clase en Eclipse y selecciono la opción del menú para crear una nueva clase de prueba JUnit, selecciono la carpeta de prueba como la ubicación raíz y el resto de la estructura del directorio del paquete se copia automáticamente. Si los métodos se dividen en una nueva clase durante la refactorización, creo una nueva clase de prueba de la misma manera, pero muevo y edito los viejos métodos de prueba manualmente. –

0

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.

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

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

2

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.

Guardo el código de mi unidad de prueba 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.

3

La parte menos importante es organizar las pruebas.

Empiezo por poner 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 la refactorización de 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 las pruebas es importante para el éxito a largo plazo de las pruebas unitarias en proyectos grandes. ¿Alguna vez escuchó a personas quejándose 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.

Pruebas son código.