java - test - junit tutorial español
JUnit 4: configure las cosas en un banco de pruebas antes de ejecutar las pruebas(como el método @BeforeClass de una prueba, solo para un banco de pruebas) (4)
Por otro lado, es una mala idea tener pruebas unitarias que realmente llamen a recursos externos como servicios web, bases de datos, etc.
Las pruebas unitarias deben ejecutarse súper rápido y una demora de "un par de minutos" por cada ejecución del paquete significa que no se ejecutará tanto como debería.
Mi consejo:
Mire las dependencias externas burlándose en pruebas unitarias con algo como EasyMock ( http://www.easymock.org/ ).
Cree un conjunto separado de pruebas de integración con algo como Fitnesse ( http://fitnesse.org/ ) o una solución de cosecha propia que se ejecute en un entorno de prueba y que esté en constante aumento.
Quiero hacer algunas pruebas funcionales en un servicio web (tranquilo). La suite de pruebas contiene un conjunto de casos de prueba, cada uno de los cuales realiza un par de solicitudes HTTP en el servicio web.
Naturalmente, el servicio web debe ejecutarse o las pruebas fallarán. :-)
Iniciar el servicio web toma un par de minutos (hace una gran carga de datos), por lo que quiero iniciarlo con la menor frecuencia posible (al menos todos los casos de prueba que solo los recursos GET del servicio podrían compartir).
Entonces, ¿hay alguna manera de configurarme la bomba en un banco de pruebas, antes de que las pruebas se ejecuten como en un método @BeforeClass de un caso de prueba?
Una opción es usar algo como Apache Ant para iniciar su conjunto de pruebas unitarias. A continuación, puede poner una invocación de destino antes y después de su objetivo junit para iniciar y detener su servicio web:
<target name="start.webservice"><!-- starts the webservice... --></target>
<target name="stop.webservice"><!-- stops the webservice... --></target>
<target name="unit.test"><!-- just runs the tests... --></target>
<target name="run.test.suite"
depends="start.webservice, unit.test, stop.webservice"/>
Luego ejecuta su suite usando hormiga (o su herramienta de integración de elección). La mayoría de los IDE tienen soporte Ant, y hace que sea mucho más fácil mover sus pruebas a un entorno de integración continua (muchas de las cuales usan objetivos Ant para definir sus propias pruebas).
jUnit no puede hacer ese tipo de cosas, aunque TestNG sí tiene anotaciones @BeforeSuite
y @AfterSuite
. Normalmente, obtienes tu sistema de compilación para hacerlo. En maven, existen las fases de "prueba previa a la integración" y "prueba posterior a la integración". En ANT, bueno, solo agrega los pasos a la tarea.
Su pregunta es más o menos un duplicado de la ejecución de Antes y Después de la Suite en jUnit 4.x , así que eche un vistazo a las sugerencias de allí.
La respuesta ahora es crear una @ClassRule
dentro de su suite. La regla se invocará antes o después (según cómo lo implemente) cada clase de prueba se ejecuta. Hay algunas clases básicas diferentes que puede ampliar / implementar. Lo bueno de las reglas de clase es que si no las implementa como clases anónimas, ¡puede reutilizar el código!
Aquí hay un artículo sobre ellos: http://java.dzone.com/articles/junit-49-class-and-suite-level-rules
Aquí hay un código de muestra para ilustrar su uso. Sí, es trivial, pero debe ilustrar el ciclo de vida lo suficientemente bien como para que pueda comenzar.
Primero la definición de la suite:
import org.junit.*;
import org.junit.rules.ExternalResource;
import org.junit.runners.Suite;
import org.junit.runner.RunWith;
@RunWith( Suite.class )
@Suite.SuiteClasses( {
RuleTest.class,
} )
public class RuleSuite{
private static int bCount = 0;
private static int aCount = 0;
@ClassRule
public static ExternalResource testRule = new ExternalResource(){
@Override
protected void before() throws Throwable{
System.err.println( "before test class: " + ++bCount );
sss = "asdf";
};
@Override
protected void after(){
System.err.println( "after test class: " + ++aCount );
};
};
public static String sss;
}
Y ahora la definición de clase de prueba:
import static org.junit.Assert.*;
import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExternalResource;
public class RuleTest {
@Test
public void asdf1(){
assertNotNull( "A value should''ve been set by a rule.", RuleSuite.sss );
}
@Test
public void asdf2(){
assertEquals( "This value should be set by the rule.", "asdf", RuleSuite.sss );
}
}