java - Cucumber Test a Spring Boot Application
cucumber spring boot (5)
Además de @jakehschwartz, si quieres que la aplicación web comience en un puerto aleatorio disponible, AbstractSpringTest necesita:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = Application.class, loader = SpringApplicationContextLoader.class)
@WebIntegrationTest({"server.port=0"})
public abstract class AbstractSpringTest {
@Value("${local.server.port}")
protected int serverPort;
...}
¿Alguien sabe dónde puedo encontrar una aplicación de muestra donde se usa Pepino para probar una aplicación Spring Boot a través de Gradle? Puedo ejecutar bien las pruebas iniciando el servidor en la línea de cmd y utilizando mi IDE, pero necesito poder ejecutarlas todas programáticamente en el servidor de CI. Vi la respuesta aquí pero esa solución no funcionó para mí, muy probablemente porque tengo varios archivos de definición de pasos.
He aquí mi arreglo
build.grade (mencionado en la otra pregunta)
testCompile ("org.springframework.boot:spring-boot-starter-test",
...
"info.cukes:cucumber-spring:${cucumberVersion}")
CucumberTest.java
@RunWith(Cucumber.class)
@CucumberOptions(format = "pretty", features = "src/test/resources")
public class CucumberTest{
}
AbstractSpringTest.java (extendido por todos los archivos de StepDef)
@SpringApplicationConfiguration(classes = Application.class)
@RunWith(SpringJUnit4ClassRunner.class)
@Ignore
public abstract class AbstractSpringTest
{ ... }
No está haciendo lo correcto en el arranque porque es 1. intentando inicializar mis archivos de definición de pasos y 2. Mi aplicación no se inicia y las pruebas de pepino no pueden establecer una conexión.
Gracias.
EDITAR: O si alguien puede decirme cómo iniciar y detener la aplicación usando gradle, eso sería aceptable también.
He resuelto el problema con algo de ayuda de esta pregunta .
Aquí está el repositorio con la respuesta: https://github.com/jakehschwartz/spring-boot-cucumber-example
En resumen, la clase AbstractSpringTest
necesita tener las siguientes anotaciones: @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = DemoApplication.class, loader = SpringApplicationContextLoader.class) @WebAppConfiguration @IntegrationTest
Hice algo como esto para hacer que Spring funcione con las pruebas parametrizadas JUnit. Debería ser el mismo concepto para Pepino, pero no lo he probado. Estaba usando la configuración XML, por lo que podría marcar la diferencia.
RunWithSpringJUnit4
public abstract class RunWithSpringJUnit4 {
private TestContextManager testContextManager;
public RunWithSpringJUnit4() {
try {
this.testContextManager = new TestContextManager(getClass());
this.testContextManager.prepareTestInstance(this);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Prueba de pepino
@RunWith(Cucumber.class)
@CucumberOptions(format = "pretty", features = "src/test/resources")
public class CucumberTest extends RunWithSpringJUnit4 {
}
Primero, deberá asegurarse de haber aplicado la bota de resorte en gradle. Invoque gradle build
que producirá un jar ejecutable. En lugar de tener su invocación manifiesta para la clase Spring como su principal, tenga un contenedor que lo inicie en un hilo, espere a que se estabilice y ejecute Cucumber :
@RunWith(Cucumber.class)
public class LucasePsCucumberTest implements Runnable {
public static void main(String[] args) {
Thread t = new Thread(this);
t.start();
// wait for t
cucumber.api.cli.Main(null);
}
}
Tenía un síntoma similar, mi pepino no comenzaría en el contexto de primavera ...
Resulta que me había perdido (una de) las siguientes dependencias:
build.gradle
testCompile "info.cukes:cucumber-junit:1.2.4"
testCompile "info.cukes:cucumber-java:1.2.4"
testCompile "info.cukes:cucumber-spring:1.2.4"
StepDefs.java
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(
loader = SpringApplicationContextLoader.class,
classes = Application.class
)
@WebIntegrationTest(randomPort = true)
public class StepDefs {
@Value("${local.server.port}")
int port;
}
Actualización: SpringBoot 1.5.1
@ContextConfiguration(
loader = SpringBootContextLoader.class,
classes = Application.class
)