Comment définir le chemin d'accès à mes fonctionnalités Cucumber à l'aide de concombre-junit ?
-
12-12-2019 - |
Question
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 modifier cela pour
@Cucumber.Options(paths={"src/test/resources/"})
mais l'annotation @Cucumber.Options
n'est pas disponible du tout.Mon 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>
Est-ce que j'ai raté quelque chose ?
Mise à jour Il me manquait quelque chose :Le fichier de fonctionnalités du concombre doit être dans un sous-répertoire src/test/resources/mypackage/
.Sinon, il ne sera pas récupéré par le test Junit.
Je peux exécuter mes tests de fonctionnalités lorsque je les mets 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.
La solution
Jetez un oeil à ma question ici:
Vous pouvez spécifier un emplacement sur le chemin de classe en définissant l'attribut de fonctionnalité dans l'annotation des options comme
@Cucumber.Options(features="src/test/resources")
Modifier:
dans les nouvelles versions, le code est
@CucumberOptions(features="src/test/resources")
Autres conseils
Le classpath
n'est pas évidente dans la documentation de Cucumber (elle n'est pas non plus dans le JavaDoc), j'ai fini par la déduire du Documentation CLI, qui contient d'autres options de localisation documentées.Voir le List configuration options
section dans la documentation.Il n'est pas non plus évident de savoir comment obtenir les définitions de fonctionnalités d'un autre module d'un projet Maven multi-modules.
C'est ce qui m'a permis de démarrer (à partir de l'IDE et de la ligne de commande) dans un projet multi-modules 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.Notez qu'il n'y a pas de leader /
Sur le chemin.L'utilisation du chemin de classe est moins fragile, car le chemin de classe (plutôt que le répertoire de travail actuel) doit être bien défini.
Vous pouvez utiliser
@CucumberOptions(
format = "pretty",
tags = {"~@Ignore"},
features = "src/test/resources/com/" //refer to Feature file
)
pour analyser tout le fichier de fonctionnalité dans le package
Ok, je ne peux mettre ça que lundi matin...La disposition des répertoires que j'ai utilisée n'était pas correcte, j'ai oublié de placer 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 packages nécessaires dans src/test/resources/
!
Une fois que vous utilisez
import cucumber.api.CucumberOptions;
Vous devrez ajouter ce qui suit à votre pom.xml, sinon "mvn test" ne fonctionnera pas.Et vous ne pouvez exécuter vos tests qu'à partir de l'EDI.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>
Ou vous pouvez simplement construire vos arguments concombreoptions, comme dans https://cucumber.io/docs/reference/jvm#cli-runner décrit et transmettez-le à concombre.api.cli.Main.run().Ceci est 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 besoin de créer une classe distincte pour chaque classe de test uniquement avec d'autres arguments.
En plaçant le fichier de fonctionnalités sous src/test/java où le coureur et les étapes déposent ou en le mettant sous src/main/java le problème sera résolu.
N'oublie pas de dire merci.:)