Est-ce que quelqu'un sait où trouver un exemple d'application où Cucumber est utilisé pour tester une application Spring Boot via Gradle? Je peux exécuter les tests correctement en démarrant le serveur sur la ligne cmd et en utilisant mon IDE, mais je dois pouvoir les exécuter tous par programme sur le serveur CI. J'ai vu la réponse ici, mais cette solution n'a pas fonctionné pour moi, probablement parce que j'ai plusieurs fichiers de définition d'étape.
Voici ma configuration
build.grade (mentionné dans l'autre question)
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 (étendu par tous les fichiers StepDef)
@SpringApplicationConfiguration(classes = Application.class)
@RunWith(SpringJUnit4ClassRunner.class)
@Ignore
public abstract class AbstractSpringTest
{ ... }
Il ne fait pas la bonne chose au démarrage parce que 1. il essaie d'initialiser mes fichiers step def et 2. Mon application n'est pas démarrée et les tests de concombre ne peuvent pas établir de connexion.
Merci.
EDIT: Ou si quelqu'un peut me dire comment démarrer et arrêter l'application en utilisant gradle, ce serait également acceptable.
J'ai résolu le problème avec l'aide de cette question .
Voici le référentiel avec la réponse: https://github.com/jakehschwartz/spring-boot-cucumber-example
En bref, la classe AbstractSpringTest
doit avoir les annotations suivantes: @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = DemoApplication.class, loader = SpringApplicationContextLoader.class) @WebAppConfiguration @IntegrationTest
J'ai eu un symptôme similaire, mon concombre n'a pas démarré le contexte du printemps ...
Il s'avère que j'avais manqué (l'une des) dépendances suivantes:
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;
}
Mise à jour: SpringBoot 1.5.1
@ContextConfiguration(
loader = SpringBootContextLoader.class,
classes = Application.class
)
Suite à @jakehschwartz, si vous voulez que l'application web démarre sur un port disponible aléatoire, AbstractSpringTest a besoin de:
@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;
...}
Tout d'abord, vous devrez vous assurer d'avoir spring-boot appliqué en gradle. Invoquer gradle build
qui produira un pot exécutable. Au lieu d'avoir votre appel manifeste pour la classe Spring en tant que votre principal, ayez un wrapper qui le démarre dans un thread, attend qu'il se stabilise et s'exécute 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);
}
}
J'ai fait quelque chose comme ça pour que Spring travaille avec les tests paramétrés JUnit. Ce devrait être le même concept pour le concombre, mais je ne l'ai pas essayé. J'utilisais la configuration XML, donc cela pourrait faire une différence.
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();
}
}
}
CucumberTest
@RunWith(Cucumber.class)
@CucumberOptions(format = "pretty", features = "src/test/resources")
public class CucumberTest extends RunWithSpringJUnit4 {
}