Estoy aprendiendo los conceptos de desarrollo basado en pruebas leyendo los artículos de Craftsman (haga clic en Craftsman debajo de Por tema ) recomendados en una respuesta a mi pregunta anterior, "Proyecto de muestra para aprender JUnit y la ingeniería de software adecuada" . ¡Me encanta hasta ahora!
Pero ahora quiero sentarme y probarlo yo mismo. Tengo una pregunta que espero que solo necesite una respuesta simple.
¿Cómo organizas tus clases de prueba JUnit y tu código real? Me refiero principalmente a la estructura del paquete, pero cualquier otro concepto importante también sería útil.
¿Pones clases de prueba en org.myname.project.test. * Y código normal en org.myname.project. *? ¿Pones las clases de prueba junto a las clases normales? ¿Prefieres prefijar los nombres de las clases con Test en lugar de agregarles un sufijo?
Sé que esto parece ser el tipo de cosas por las que no debería preocuparme tan pronto, pero soy una persona muy centrada en la organización. Soy casi el tipo de persona que dedica más tiempo a descubrir métodos para realizar un seguimiento de lo que se debe hacer, en lugar de hacer las cosas realmente.
Y tengo un proyecto que actualmente está perfectamente dividido en paquetes, pero el proyecto se convirtió en un desastre. En lugar de intentar refactorizar todo y escribir pruebas, quiero empezar de cero, primero las pruebas. Pero primero necesito saber a dónde van mis pruebas.
editar: Me olvidé por completo de Maven, ¡pero parece que la mayoría de ustedes lo están usando! En el pasado tuve un caso de uso específico en el que Maven me rompió por completo, pero Ant me dio la flexibilidad que necesitaba, así que terminé apegado a Ant, pero estoy pensando que tal vez estaba tomando el enfoque equivocado. Creo que le daré a Maven otra oportunidad porque parece que irá bien con el desarrollo basado en pruebas.
fuente
Respuestas:
Prefiero poner las clases de prueba en el mismo paquete que las clases de proyecto que prueban, pero en un directorio físico diferente, como:
En un proyecto de Maven, se vería así:
El punto principal en esto es que mis clases de prueba pueden acceder (¡y probar!) Clases y miembros de alcance de paquete.
Como muestra el ejemplo anterior, mis clases de prueba tienen el nombre de la clase probada más
Test
como sufijo. Esto ayuda a encontrarlos rápidamente; no es muy divertido intentar buscar entre un par de cientos de clases de prueba, cada una de las cuales comienza conTest
...Actualización inspirada en el comentario de @ Ricket: de esta manera, las clases de prueba (típicamente) aparecen justo después de su amigo probado en una lista alfabética de nombres de clases por proyecto. (Es curioso que me esté beneficiando de esto día a día, sin haberme dado cuenta conscientemente cómo ...)
Actualización 2: A muchos desarrolladores (incluyéndome a mí) les gusta Maven, pero parece haber al menos la misma cantidad que no. En mi humilde opinión, es muy útil para proyectos Java "convencionales" (yo pondría alrededor del 90% de los proyectos en esta categoría ... pero el otro 10% sigue siendo una minoría considerable). Es fácil de usar si se pueden aceptar las convenciones de Maven; sin embargo, si no, hace que la vida sea una lucha miserable. Maven parece ser difícil de comprender para muchas personas socializadas en Ant, ya que aparentemente requiere una forma de pensar muy diferente. (Yo mismo, como nunca he usado Ant, no puedo comparar los dos.) Una cosa es segura: hace que las pruebas de unidad (e integración) sean un paso natural y de primera clase en el proceso, lo que ayuda a los desarrolladores a adoptar esta práctica esencial.
fuente
public
) .Pongo mis clases de prueba en el mismo paquete que lo que están probando pero en una carpeta de origen o proyecto diferente . Organizar mi código de prueba de esta manera me permite compilarlo y empaquetarlo fácilmente por separado para que los archivos jar de producción no contengan código de prueba. También permite que el código de prueba acceda a los campos y métodos privados del paquete.
fuente
Yo uso Maven . La estructura que promueve Maven es: -
es decir, una clase de prueba con Prueba antepuesta al nombre de la clase bajo prueba está en una estructura de directorio paralela a la prueba principal.
Una ventaja de tener las clases de prueba en el mismo paquete (aunque no necesariamente en el directorio) es que puede aprovechar los métodos del alcance del paquete para inspeccionar o inyectar objetos de prueba simulados.
fuente
<class>Test.java
, noTest<class>.java
<class>Test.java
esquema de nomenclatura hace que tanto la clase principal como la clase de prueba se muestren de cerca cuando se usan las funciones de búsqueda IDE, lo que lo hace un poco mejor queTest<class>.java
.