2010-03-05 17 views
98

estoy aprendiendo los conceptos de Test-Driven Development través de la lectura de la (Craftsman clic bajo Por Tema) Craftsman articles recomienda en una respuesta a mi pregunta anterior, "Sample project for learning JUnit and proper software engineering". ¡Me encanta hasta ahora!Separación de clases JUnit en un paquete de prueba especial?

Pero ahora quiero sentarme y probarlo yo mismo. Tengo una pregunta que espero necesite solo una respuesta simple.

¿Cómo organizas tus clases de prueba JUnit y tu código real? Estoy hablando principalmente de la estructura del paquete, pero cualquier otro concepto de nota sería útil también.

¿Pone clases de prueba en org.myname.project.test. * Y código normal en org.myname.project. *? ¿Pone las clases de prueba junto a las clases normales? ¿Prefieres prefijar los nombres de clase con Prueba en lugar de sufijarlos?

Sé que esto parece algo de lo 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 encontrar métodos para hacer un seguimiento de qué 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 tratar de refactorizar todo y escribir pruebas, quiero comenzar de nuevo, probar primero y todo. Pero primero necesito saber a dónde van mis exámenes.


edición: me olvidó completamente Maven, pero parece que la mayoría de ustedes lo están utilizando! En el pasado, tenía un caso de uso específico en el que Maven se derrumbaba por completo sobre mí, pero Ant me daba la flexibilidad que necesitaba, así que terminé vinculado a Ant, pero estoy pensando que tal vez estaba tomando el enfoque equivocado. Creo que volveré a intentar con Maven porque parece que funcionará bien con el desarrollo basado en pruebas.

+1

posible duplicado de [¿Dónde debería poner mis pruebas JUnit?] (Http://stackoverflow.com/questions/811827/where-should-i-put-my-junit-tests) – Mark

Respuesta

135

Yo prefiero poner las clases de prueba en el mismo paquete que las clases de proyectos que ponen a prueba, pero en un directorio físico diferente, como:

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

En un proyecto 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 del alcance del 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 encontrar de forma rápida - que no es muy divertido para tratar de buscar entre un par de cientos de clases de prueba, cada uno de cuyo nombre empieza con Test ...

actualización inspirado por el comentario de @ Ricket: de esta manera las clases de prueba (por lo general) aparece justo después de su amigo probado en una lista alfabética de proyectos de nombres de clase. (Es curioso que estoy beneficiando de este día a día, sin haber dado cuenta de lo consciente ...)

Update2: Una gran cantidad de desarrolladores (incluido yo mismo) como el Maven, pero no parece ser al menos tan muchos que no lo hagas En mi humilde opinión, es muy útil para los proyectos "mainstream" de Java (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 uno puede 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 muy diferente de pensar. (Yo, que nunca he usado Ant, no puedo comparar los dos.) Una cosa es segura: hace que las pruebas unitarias (y de integración) sean un paso natural de primera clase en el proceso, lo que ayuda a los desarrolladores a adoptar esta práctica esencial.

+0

¡Un buen punto acerca de usar un sufijo en su lugar! – Martin

+5

Estoy de acuerdo con la nota de sufijo también. Además, dado que las clases de prueba están separadas en una carpeta física diferente, no hay necesidad de probar y hacer un prefijo con Prueba en algún intento de engañar una clasificación por orden alfabético en agrupación, y creo que SomeClassTest lee mejor. – Ricket

+0

Excelentes convenciones +1 – whiskeysierra

9

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 la prueba antes del nombre de la clase que se está probando está en una estructura de directorios en paralelo a la prueba principal.

Una ventaja de tener las clases de prueba en el mismo paquete (no necesariamente el directorio) es que puede aprovechar los métodos de alcance de paquete para inspeccionar o inyectar objetos de prueba simulados.

+14

Pensé que era ' Test.java', no 'Prueba .java' –

+1

Maven aceptará cualquiera de los patrones, según [la documentación del plugin Maven Surefire] (http://maven.apache.org/surefire/maven-surefire-plugin/examples/inclusion -exclusion.html). –

+1

Argumentaría que el esquema de nomenclatura ' Test.java' 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 .java'. – christopheml

14

Pongo mis clases de prueba en el mismo paquete que lo que están probando pero en una carpeta fuente diferente o proyecto. 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 campos y métodos privados del paquete.

Cuestiones relacionadas