¿Separación de clases JUnit en un paquete de prueba especial?

118

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.

Ricket
fuente
1
posible duplicado de ¿Dónde debo poner mis pruebas JUnit?
mmmmmm

Respuestas:

154

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:

myproject/src/com/foo/Bar.java
myproject/test/com/foo/BarTest.java

En un proyecto de Maven, se vería así:

myproject/src/main/java/com/foo/Bar.java
myproject/src/test/java/com/foo/BarTest.java

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 Testcomo 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 con Test...

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.

Péter Török
fuente
6
También estoy de acuerdo con la nota de sufijo. Además, dado que las clases de prueba están separadas en una carpeta física diferente, no hay necesidad de probar y prefijar Test en algún intento de engañar a una clasificación por orden alfabético en agrupaciones, y creo que SomeClassTest se lee mejor.
Ricket
Excelentes convenciones +1
whiskeysierra
1
Una cosa acerca de poner clases de prueba en el mismo paquete: si bien permite usar miembros privados del paquete (razón por la cual también uso este esquema), tampoco permite probar la visibilidad automáticamente, especialmente. si usa TDD y deja que su IDE genere los códigos auxiliares del método necesarios. Puede generarlos con visibilidad de paquete privado (NetBeans, te estoy mirando), lo que hace que tu prueba pase perfectamente (después de que hayas puesto la implementación en esos stubs), pero puede fallar en el uso real (si olvidaste agregar public) .
Sergei Tachenov
Si bien esta convención es interesante, ¿qué hace cuando crece el conjunto de pruebas? Por ejemplo, digamos que tiene 6 métodos en la clase, cada método tiene 10 pruebas. ¿Tienes 60 exámenes en tu clase? Normalmente subdivido la clase de prueba (una clase de prueba por método). El problema con esto es que puede encontrar muchas clases en su paquete de prueba.
mmalmeida
1
@Thick_propheT en Eclipse: haga clic derecho en el nombre del proyecto, haga clic en Nuevo - Otro ..., luego dentro de la carpeta Java seleccione Carpeta de origen. asígnele el nombre "prueba". Luego, si desea seguir la convención anterior, agregue un nuevo paquete a esta carpeta de prueba que tenga el mismo nombre que el paquete de la clase para la que desea escribir el caso de prueba, luego en el paquete agregue un nuevo JUnit Test Case (ubicado en la carpeta Java / Junit cuando hace New-Other ...). en ese nuevo asistente, puede especificar la clase que se está probando y nombrar su caso de prueba con el mismo nombre con el sufijo "Prueba"
o el
15

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.

ChrisH
fuente
12

Yo uso Maven . La estructura que promueve Maven es: -

src/main/java/org/myname/project/MyClass.java

src/test/java/org/myname/project/TestMyClass.java

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.

Martín
fuente
18
Pensé que era <class>Test.java, noTest<class>.java
Mike Rylander
2
Maven aceptará cualquier patrón, según la documentación del complemento Surefire de Maven .
Elijah Woodward
3
Yo diría que el <class>Test.javaesquema 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 que Test<class>.java.
christopheml
1
@christopheml Estoy de acuerdo, eso es lo que hago ahora.
Martin
Esto funcionó para Intellij. MyClassTest.java no funcionó.
user2761431