2011-06-01 11 views
5

Estoy trabajando con un proyecto legado que tiene:¿Puede Ant categorizar pruebas JUnit basadas en la jerarquía de herencia?

  • unidad pura prueba
  • Pruebas de integración (lento para correr, tienen todo tipo de dependencias desagradables)

Busco la forma más sencilla de ejecutar ambos tipos de pruebas por separado con Ant.

Me pregunto si hay una manera de tener Ant reconocer automáticamente estas dos categorías basadas en la jerarquía de herencia:

StringUtilsTest extends TestCase // "pure unit test" 

vs

ProductionDBTest extends AbstractTransactionalTesterBase // "integration test" 

Hay una jerarquía de superclases abstractas que las pruebas de integración se basan encendido, pero todos se reducen a algunas clases de prueba de primavera y finalmente AbstractSpringContextTests que se extiende junit.framework.TestCase.

En otras palabras, ¿puedo distinguir, en Ant, pruebas que extienden (indirectamente) AbstractSpringContextTests y pruebas que extienden directamente TestCase? O tendría que pasar manualmente las pruebas y, p. ponerlos en Categories o TestSuites por separado? (Hay muchas pruebas para que yo no quiero hacer eso.)


Resolución: Traté de Sean (muy prometedor) approach, pero no podía hacerlo funcionar (fácilmente). Así que terminé examinando las pruebas semi-manualmente después de todo, anotando las puras (que era el grupo más pequeño) usando una configuración descrita en this SO question, y ejecutándolas con Ant like this. (Tenga en cuenta que la escritura de un TestRunner personalizado es no es necesario)

Respuesta

4

La solución que utilizamos para categorizar nuestras pruebas JUnit fue el uso de una anotación personalizada. A continuación, puede usar un TestRunner personalizado con el que se le puede asignar un indicador o argumento con respecto a qué tipos de prueba ejecutar o todos.

Lo sentimos, no hay código de ejemplo, pero la creación de anotaciones y un TestRunner es bastante básico, ¡pruébalo!

+1

En última instancia, fui con anotaciones, por lo que podría aceptar esto, pero ... Tengo un problema con su advocación de TestRunners personalizados. :) Nunca habiendo escrito uno, no parecía * que * directo para mí, basado en googlear por un tiempo. Afortunadamente, TestRunner personalizado no es ** necesario **, ya que puede usar una configuración como [esto] (http://stackoverflow.com/questions/2176570/how-to-run-all-tests-belonging-to-a -cierta-categoría-en-junit-4)! – Jonik

0

No he usado esto por mi cuenta. Pero soy consciente de que usted expresa pruebas unitarias para ejecutar como una colección de recursos, y esas se pueden definir con restrictions. Y, una posible restricción es "instanceof" que le permite seleccionar clases basadas en la superclase. Eso le permite seleccionar las pruebas de integración, y luego usar la función de "diferencia" de la colección de recursos puede seleccionar todo lo demás. No está mal, si no es trivial. Esto funciona en Ant 1.8+, creo.

+0

¡Gracias, parece interesante! Sin embargo, estoy teniendo problemas para que funcione 'instanceof' ... no estoy seguro de cómo se supone que debes introducir el antlib" org.apache.tools.ant.types.resources.selectors "en el archivo del proyecto - poniendo el atributo xmlns : rsel = "antlib: org.apache.tools.ant.types.resources.selectors" en el elemento del proyecto o qué? Oh, bueno, voy a continuar mañana. Usar Ant 1.8.1 por lo que no debería ser un problema. – Jonik

2

La forma más sencilla es asignar nombres a las clases de prueba que terminan con el tipo de prueba

digamos que estábamos probando fechas.

DateTest.java (pruebas normales rápido)

DateSysTest.java (correr largas)

Luego, en que había dos objetivos uno las pruebas unitarias rápidas tiene

<batchtest todir="your dir"> 
     <!--Run unit tests for each class with suffix Test, unless it is SysTest or StressTest--> 
     <fileset dir="${src}/test" 
     includes="**/*Test.java" 
     excludes="**/*StressTest.java **/*SysTest.java" /> 
    </batchtest> 

A continuación, crea unos objetivos de hormigas, uno para pruebas rápidas uno para las pruebas sys y uno de ellos hacer todo .. Algo así. Es decir si puede cambiar el nombre de sus clases de prueba.

+0

+1 Mi respuesta se refiere al uso de anotaciones para diferenciar los tipos de prueba. Esto es bueno porque no evitará que la gente cambie el nombre de las pruebas debido al temor a generar versiones falsas. Dicho esto, las convenciones de nomenclatura se pueden usar con eficacia, y si es así, esta solución es más simple de entender y más fácil de implementar. –

+0

No es lo que terminé usando esta vez, pero +1 de todos modos porque esta es una manera probada (aunque antigua) de separar las categorías de prueba que funciona sin problemas con la mayoría de las herramientas (IDEs, Ant, etc.). – Jonik

Cuestiones relacionadas