unitaria - pruebas junit en java
¿Cómo ejecutar todas las pruebas JUnit en una categoría/suite con Ant? (2)
Estoy usando JUnit Categories y ClassPathSuite en una configuración similar a la descrita en esta respuesta . Recordar:
public interface FastTests {
}
@RunWith(Categories.class)
@Categories.IncludeCategory(FastTests.class)
@Suite.SuiteClasses(AllTests.class)
public class FastTestSuite {
}
@RunWith(ClasspathSuite.class)
public class AllTests {
}
... donde AllTests hace uso de la biblioteca ClasspathSuite .
Una clase de prueba que sea parte de la categoría FastTests se vería así:
@Category(FastTests.class)
public class StringUtilsTest {
// ...
}
Cuando ejecuto "FastTestSuite" en mi IDE, todas las pruebas con la anotación FastTests se ejecutan, agradable y sin problemas:
Ahora, quiero hacer lo mismo con Ant . (Para mi sorpresa, no pude encontrar instrucciones para esto en SO.) En otras palabras, necesito un objetivo Ant que ejecute todas las pruebas con la anotación FastTests.
He intentado algunos enfoques simplistas usando <test>
o <batchtest>
...
<junit showoutput="true" printsummary="yes">
<test name="fi.foobar.FastTestSuite"/>
<formatter type="xml"/>
<classpath refid="test.classpath"/>
</junit>
... pero sin suerte, hasta ahora.
Editar : además del IDE, funciona bien con JUnitCore en la línea de comando:
$ java -classpath "classes:WebContent/WEB-INF/lib/*" org.junit.runner.JUnitCore fi.foobar.FastTestSuite
.............
Time: 0.189
OK (13 tests)
Bien, lo tengo trabajando con <batchtest>
simplemente:
<junit showoutput="true" printsummary="yes" fork="yes">
<formatter type="xml"/>
<classpath refid="test.classpath"/>
<batchtest todir="${test.reports}">
<fileset dir="${classes}">
<include name="**/FastTestSuite.class"/>
</fileset>
</batchtest>
</junit>
Intenté <batchtest>
antes, pero cometí el error de utilizar "**/FastTestSuite.java"
lugar de "**/FastTestSuite.class"
en el elemento <include>
... Disculpa :-)
NB : es necesario configurar fork="yes"
(es decir, ejecutar las pruebas en una VM separada); de lo contrario, esto también producirá "initializationError" en java.lang.reflect.Constructor.newInstance (Constructor.java:513) como <test>
(ver comentarios sobre la pregunta). Sin embargo, no pude hacer que <test>
funcionara incluso con fork="yes"
.
La única deficiencia es que esto produce solo un archivo de informe JUnit XML (TEST-fi.foobar.FastTestSuite.xml) que hace que parezca que todos los (cientos) de exámenes están en una clase (FastTestSuite). Si alguien sabe cómo ajustar esto para mostrar las pruebas en sus clases y paquetes originales, hágamelo saber.
Encontré una solución para usar la tarea junit de hormiga para ejecutar una prueba de una Category
específica:
<target name="test" description="Run Selenium tests by category">
<fail unless="category.name" message="Please specify ''category.name'' property"/>
<junit showoutput="true" printsummary="true" fork="true">
<formatter type="xml"/>
<classpath refid="test.classpath"/>
<batchtest todir="${test.reports}" haltonfailure="false">
<fileset dir="${classes}">
<!-- regex ''^/s*@Category'' part added to ensure @Category annotation is not commented out -->
<containsregexp expression="^/s*@Category.*${category.name}"/>
</fileset>
</batchtest>
</junit>
</target>
Ejecute la prueba suministrando la propiedad category.name
a ant como esta:
ant -Dcategory.name=FastTests test
El uso de batchtest
también producirá archivos de informe JUnit XML por prueba (por ejemplo, TEST-fi.foobar.FastTestClassN.xml).