2009-05-01 21 views
44

Tengo 2 preguntas sobre la organización de pruebas de Unidad.¿Dónde debería poner mis pruebas JUnit?

  1. ¿Tengo que poner a prueba el mismo paquete que la clase probada, o puedo organizar las pruebas en diferentes paquetes?

    Por ejemplo si tengo validez y otros pruebas, ¿es correcto dividir en diferentes paquetes, incluso si son de una misma clase?

  2. ¿Qué pasa con las clases simuladas y stub? ¿Debo separarlos de los paquetes que solo contienen pruebas o juntarlos?

Respuesta

56

La forma en que hacemos nuestros casos de prueba JUnit es ponerlos en el mismo paquete, pero en un directorio raíz diferente. Como utilizamos Maven, solo usamos las ubicaciones estándar para que la estructura sea similar a la siguiente.

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

Obviamente hay más a la estructura, pero esto nos permite construir las pruebas por separado del código de la línea principal, pero aún así acceder a las clases protegidas y similares. Con respecto a los diferentes tipos de pruebas, esto es muy subjetivo. Cuando comenzamos nuestro esfuerzo de prueba (que desafortunadamente comenzó después del desarrollo), traté de mantener las cosas bastante aisladas. Desafortunadamente, rápidamente se convirtió en una pesadilla cuando llegamos al punto de prueba de más de 500 puntos. Desde entonces he intentado hacer más consolidación. Esto condujo a cantidades reducidas de código para mantener. Como dije, sin embargo, es muy subjetivo.

En cuanto al código de solo prueba, lo guardamos en un paquete separado com.foo.test que reside solo en el árbol src/test/java.

+13

Algo similar aquí, excepto que usamos "src/com/foo/..." y "test/com/foo/...". –

+0

Personalmente, encuentro que la respuesta de Bob es aún mejor. Incluso si un JUnit prueba _es_ código fuente. – guerda

+3

Honestamente, la única razón por la que fui con src/main/java y src/test/java es para no tener que hacer ninguna configuración adicional de Maven. –

3

clases de prueba deben ser más bien en diferentes paquetes, que es más fácil separarlos del código de producción al empaquetar para la liberación. Normalmente guardo un montón de pelusa de prueba en esos paquetes, todo tipo de simulacros, configuraciones, escenarios ... Pero cuando construyes, no lo entiendo. En algunas situaciones, es una buena idea mantener sus pruebas incluso en diferentes proyectos. Depende

2

Mantenerlo en el mismo paquete le permite utilizar la visibilidad paquete privado para el código al que se debe acceder solo a través de la prueba.

En cuanto al uso de directorios raíz separados, es una buena práctica. También tiene una ventaja para nosotros, ya que usamos IDEA, IDEA reconoce que el código de producción no puede hacer referencia al código de prueba.

En términos de mantenerlos separados, existe una gran potencia para tener una y solo una clase de prueba por clase de producción a nivel de unidad. Por supuesto, algunas clases se crean en producción como parte de la refactorización que no tienen ninguna clase de prueba, y eso está bien, pero cuando se quiere saber qué prueba evalúa cierta clase, teniendo una convención que dice ClassNameTest son las pruebas para ClassName es muy útil.

TestNG es mucho más amigable con este paradigma que JUnit, sin embargo.

3

Yo también tiendo a poner mis pruebas en el mismo paquete pero bajo un directorio raíz diferente. Esto me permite probar clases privadas de paquete o acceder a clases privadas de embalaje mientras pruebo algo más en el paquete. Se guardan en un árbol de directorio separado para permitir su exclusión del resultado desplegado (en particular, para garantizar que el código de prueba no ingrese accidentalmente en el código de producción). Lo que más importa, sin embargo, es lo que funciona para su situación.

En términos de la cantidad de clases de prueba por clase de producción, la teoría que he visto es que se escribe una clase de prueba por accesorio, es decir, por estructura de configuración. En muchos casos, eso es lo mismo (o lo suficientemente parecido) a una clase de prueba por clase de producción, pero a veces escribo más clases de prueba (en particular, las pruebas de igualdad tienden a separarse) para una clase de producción dada, y ocasionalmente una clase de prueba de para un grupo de clases de producción (relacionadas) (por ejemplo, para probar el patrón de Estrategia).

Principalmente, no me preocupo demasiado por la teoría, pero modifico las pruebas según sea necesario para mantener la duplicación al mínimo absoluto.

Cuestiones relacionadas