web-dev-qa-db-fra.com

Comment définir le chemin d'accès à mes fonctionnalités Cucumber à l'aide de cucumber-junit?

J'essaie de construire mes premières spécifications exécutables avec Java et Maven. J'ai créé un projet simple avec cette structure:

specification
|-src
  |-test
    |-Java
      |-mypackage
        |-MyFeatureTest.Java
    |-resources
      |-MyFeature.feature

Dans le test junit MyFeatureTest.Java J'ai ceci:

import org.junit.runner.RunWith;
import cucumber.junit.Cucumber;

@RunWith(Cucumber.class)
public class HomepageTest {
}

Maintenant https://github.com/cucumber/cucumber-jvm/wiki/IDE-support dit que je devrais ajouter la ligne suivante:

@Cucumber.Options(paths={"my/super.feature:34"})

J'ai essayé de le modifier pour

@Cucumber.Options(paths={"src/test/resources/"})

mais l'annotation @Cucumber.Options n'est pas disponible du tout. Ma pom.xml a ces dépendances:

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.10</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>info.cukes</groupId>
  <artifactId>cucumber-Java</artifactId>
  <version>1.0.0.RC20</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>info.cukes</groupId>
  <artifactId>cucumber-junit</artifactId>
  <version>1.0.0.RC20</version>
  <scope>test</scope>
</dependency>

Suis-je en train de manquer quelque chose?

Mise à jour Il me manquait quelque chose: le fichier de fonctionnalité du concombre doit être dans un sous-répertoire src/test/resources/mypackage/. Sinon, il ne sera pas détecté par le test de junit.

Je peux exécuter mes tests de fonctionnalités lorsque je les place dans le même répertoire src/main/test/, donc ce n'est pas un bloqueur pour moi. Mais j'aimerais comprendre toute la configuration.

19
cringe

Jetez un oeil à ma question ici :

Vous pouvez spécifier un emplacement sur le chemin de classe en définissant l'attribut d'entité dans l'annotation d'options comme

@Cucumber.Options(features="src/test/resources")

Éditer:

dans les nouvelles versions, le code est

@CucumberOptions(features="src/test/resources")
17
lanoxx

Je suis assez en retard à la fête (4 ans!) Mais j'ai pensé que cela valait une réponse car personne n'a mentionné classpath évaluation et les solutions ci-dessus ne fonctionnaient pas dans une situation multi-modules Maven.

L'option classpath n'était pas évidente dans la documentation Cucumber (pas dans JavaDoc non plus), j'ai fini par la déduire de documentation CLI , qui a d'autres options de localisation documentées. Voir le List configuration options section dans la documentation.

C'est ce qui m'a fait avancer (à partir de IDE et ligne de commande) dans un projet multi-module Maven.

@CucumberOptions(
        features = {"classpath:product"},
        //...
)
public class RunCukesTest extends AbstractTestNGSpringContextTests {

où se trouvaient mes fichiers de fonctionnalités

main-project
    sub-module-1
        src/test/Java/com/foo/
            RunCukesTest.Java
        src/test/resources/product/
            feature_1.feature
            feature_2.feature
    sub-module-2
        ...

Ça me fait plaisir de ne pas voir src/test/resources Sur le chemin.

13
markdsievers

Vous pouvez utiliser

@CucumberOptions(
    format = "pretty",
    tags = {"~@Ignore"},
    features = "src/test/resources/com/"  //refer to Feature file
)

pour analyser tout le fichier de fonctionnalités dans le package

7
Jewel

Ok, je ne peux le mettre que lundi matin ... La disposition du répertoire que j'ai utilisée n'était pas correcte, j'ai oublié de mettre les fonctionnalités du concombre dans des sous-répertoires correspondant à la structure de mon package.

Assurez-vous de créer également les répertoires de package nécessaires dans src/test/resources/!

5
cringe

Ou vous pouvez simplement construire vos arguments cucumberoptions, comme dans https://cucumber.io/docs/reference/jvm#cli-runner décrit et le transmettre à cucumber.api.cli.Main.run ( ). Voici un petit exemple:

String arg = "classpath:MyFeature.feature --dry-run";
String[] args = arg.split(" ");
cucumber.api.cli.Main.run(args, Thread.currentThread().getContextClassLoader());

et utilisez-le dans votre test JUnit. Vous n'avez donc pas à créer une classe distincte pour chaque classe de test uniquement avec d'autres arguments.

1
user24502

Une fois que vous utilisez

import cucumber.api.CucumberOptions;

Vous devrez ajouter ce qui suit à votre pom.xml, sinon "test mvn" ne fonctionnera pas. Et vous ne pouvez exécuter vos tests qu'à partir de l'IDE. Voir: https://github.com/cucumber/cucumber-Java-skeleton/blob/master/pom.xml

<properties>
    <Java.version>1.7</Java.version>
    <junit.version>4.12</junit.version>
    <cucumber.version>1.2.2</cucumber.version>
    <maven.compiler.version>3.3</maven.compiler.version>
</properties>

<build>
    <plugins>
        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>${maven.compiler.version}</version>
            <configuration>
                <encoding>UTF-8</encoding>
                <source>${Java.version}</source>
                <target>${Java.version}</target>
                <compilerArgument>-Werror</compilerArgument>
            </configuration>
        </plugin>
    </plugins>
</build>
1
Robert Altena