2008-09-30 25 views
14

Actualmente estoy usando JUnit 4 y tengo la necesidad de dividir mis pruebas en grupos que se pueden ejecutar selectivamente en cualquier combinación. Sé que TestNG tiene una función para anotar pruebas para asignarlas a grupos, pero no puedo migrar a TestNG en este momento. Parece que esto podría lograrse fácilmente en JUnit con algunas anotaciones personalizadas y un JUnit TestRunner personalizado. Revisé los documentos de JUnit y busqué en la web, pero no pude encontrar tal cosa. ¿Alguien está enterado de tal TestRunner?¿Existe un JUnit TestRunner para ejecutar grupos de pruebas?

Actualización: Gracias por sus respuestas sobre suites de prueba. Debería haber abordado esto en mi pregunta original. Aquí vamos: no quiero usar suites de pruebas porque me requerirían que las cree y las administre manualmente, lo que significa que TODO las pruebas y las organizo en suites manualmente (demasiado trabajo y una pesadilla de mantenimiento). Todo lo que necesito hacer es ejecutar todas las pruebas unitarias, excepto algunas que realmente son pruebas de integración. Así que quiero anotar estos, y ejecutar todos los demás. En otras ocasiones, solo quiero ejecutar las pruebas de integración. También tengo la necesidad de poner una prueba unitaria en múltiples grupos, lo que no es posible con las suites. Espero que esto ayude a aclarar las cosas.

Actualización 2: Si JUnit no tiene este OOB, estoy buscando una biblioteca de código abierto que agregue esto a JUnit (anotaciones + JUnit Test Runner personalizado).

+0

Relacionado: http://stackoverflow.com/questions/457276/junit4-test-suites/4952225#4952225 – cmcginty

Respuesta

6

Revisa Spring's SpringJUnit4ClassRunner. Lo he usado para ejecutar opcionalmente pruebas basadas en una propiedad del sistema, usando la anotación IfProfileValue.

Este:

@IfProfileValue(name="test-groups", values={"unit-tests", "integration-tests"}) 
    public void testWhichRunsForUnitOrIntegrationTestGroups() { 
     // ... 
} 

se ejecutará si la propiedad del sistema de prueba 'grupos' se ha configurado como 'unidad de pruebas de integración' o 'pruebas'.

Actualización: JUnitExt tiene @Category y @Prerequisite anotaciones y parece que debería hacer lo que necesita. Sin embargo, nunca lo he usado, así que no puedo responderlo.

+0

Gracias, ambos parecen prometedores. Los veré. – thvo

+0

SpringJUnit4ClassRunner habría funcionado, pero estamos usando una versión anterior de Spring que no tiene esto. Hasta que actualicemos (no es fácil en un gran proyecto), no puedo usar este método. – thvo

+0

Nota: Spring '@ IfProfileValue' solo ** omite/ignora ** la prueba si el nombre y el valor no concuerdan y ** no lo ejecuta **. Si desea implementar el tipo de implementación de Categorías JUnit con esto, puede que necesite extender 'SpringJUnit4ClassRunner # runChild' a _not-run_ en lugar de _ignoring_. Esto importa principalmente si sus resultados están en jenkins. – raksja

0

Puede crear conjuntos, aunque eso pone toda la configuración en el conjunto y no en las anotaciones.

0

JUnit 3 le permite crear suites de prueba que se pueden ejecutar como cualquier otra prueba. ¿JUnit 4 no tiene un concepto similar?

0

Si está usando ANT o maven, puede controlar qué pruebas se ejecutan filtrando las pruebas por su nombre. Un poco incómodo, pero podría funcionar para ti.

1

No, desafortunadamente, no existe un concepto similar para los grupos TestNG. Se planeó para JUnit4, pero por algún motivo poco claro, se eliminó de la planificación.

11

JUnit no tiene ese tipo de corredor en este momento. Abordar el problema subyacente, la necesidad de obtener garantías razonables de un conjunto de pruebas en un tiempo limitado, es nuestra principal prioridad de desarrollo para el próximo lanzamiento. Mientras tanto, la implementación de un filtro que funciona a través de anotaciones parece que no sería un gran proyecto, aunque estoy predispuesto.

+0

Gracias Kent, golpeas el clavo en la cabeza señalando el problema subyacente; genial escuchar que esto se abordará en la próxima versión de JUnit. También tienes razón en que mi tiempo de aceleración para escribir un Filtro de este tipo puede ser un poco más largo que el tuyo, dado que co-escribiste a JUnit :) Sin embargo, lo investigaré. – thvo

+0

Aquí hay un enlace a la clase de filtro JavaDoc: http://junit.sourceforge.net/javadoc/org/junit/runner/manipulation/Filter.html – thvo

3

En primer lugar, está abordando dos problemas: pruebas unitarias (a menudo en el mismo paquete que la unidad bajo prueba) y pruebas de integración. Por lo general, mantengo mis pruebas de integración en un paquete separado, algo así como com.example.project.tests. En Eclipse, mis proyectos se parecen:

project/ 
    src/ 
    com.example.project/ 
    tsrc/ 
    com.example.project/ 
    com.example.project.tests/ 

Al hacer clic derecho en un paquete y seleccionar 'Ejecutar' ejecuta las pruebas en el paquete; haciendo lo mismo en la carpeta fuente ejecuta todas las pruebas.

Puede lograr un efecto similar, aunque expresó un desinterés en él, utilizando el Suite runner. Sin embargo, esto viola el DRY: debe mantener copias de los nombres de las pruebas actualizadas en las clases del paquete. Sin embargo, puede poner fácilmente la misma prueba en varias suites.

@RunWith(Suite.class) 
@Suite.SuiteClasses({ 
    TestAlpha.class, 
    TestBeta.class }) 
public class GreekLetterUnitTests { 
} 

Por supuesto, realmente debería mantener estas cosas automatizadas. Un buen método para hacerlo es usar the Ant task.

<target name="tests.unit"> 
    <junit> 
    <batchtest> 
     <fileset dir="tsrc"> 
     <include name="**/Test*.java"/> 
     <exclude name="**/tests/*.java"/> 
     </fileset> 
    </batchtest> 
    </junit> 
</target> 
<target name="tests.integration"> 
    <junit> 
    <batchtest> 
     <fileset dir="tsrc"> 
     <include name="**/tests/Test*.java"/> 
     </fileset> 
    </batchtest> 
    </junit> 
</target> 
0

TestNG tiene mi voto. Está basado en anotaciones, puede ejecutarse como Grupos, Pruebas individuales, etc., se puede vincular a Maven y puede ejecutar todas las pruebas de JUnit como parte de las ejecuciones de prueba.

Lo recomiendo a través de JUnit.

0

mi consejo es simplemente abandonar JUnit y usar TestNG. Una vez que te acostumbras a TestNG, Junit se parece a Stone Age.

Cuestiones relacionadas