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.
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")
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.
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
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/
!
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.
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>