web-dev-qa-db-fra.com

Concombre teste une application Spring Boot

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.

24
jakehschwartz

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

13
jakehschwartz

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
)
6
Nick Grealy

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;
...}
1
Joe Stepowski

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);
     }
}
0
hd1

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 {
}
0
LucasP