¿Cómo configuro la ruta a mis funciones de Cucumber usando pepino-junit?
-
12-12-2019 - |
Pregunta
Intento crear mis primeras especificaciones ejecutables con Java y Maven.Creé un proyecto simple con esta estructura:
specification
|-src
|-test
|-java
|-mypackage
|-MyFeatureTest.java
|-resources
|-MyFeature.feature
en la prueba junit MyFeatureTest.java
Tengo esto:
import org.junit.runner.RunWith;
import cucumber.junit.Cucumber;
@RunWith(Cucumber.class)
public class HomepageTest {
}
Ahora https://github.com/cucumber/cucumber-jvm/wiki/IDE-support dice que debo agregar la siguiente línea:
@Cucumber.Options(paths={"my/super.feature:34"})
Intenté modificar eso para
@Cucumber.Options(paths={"src/test/resources/"})
pero la anotación @Cucumber.Options
no está disponible en absoluto.Mi pom.xml
tiene estas dependencias:
<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>
¿Me estoy perdiendo de algo?
Actualizar Me faltaba algo:El archivo de características del pepino debe estar en un subdirectorio. src/test/resources/mypackage/
.De lo contrario, la prueba junit no lo detectará.
Puedo ejecutar mis pruebas de funciones cuando las coloco en el mismo directorio src/main/test/
, entonces no es un bloqueador para mí.Pero me gustaría entender toda la configuración.
Solución
Echa un vistazo a mi pregunta aquí:
Puede especificar una ubicación en el classpath configurando el atributo de característica en la anotación de opciones como
@Cucumber.Options(features="src/test/resources")
Editar:
en las nuevas versiones el código es
@CucumberOptions(features="src/test/resources")
Otros consejos
El classpath
La opción no es obvia en la documentación de Cucumber (tampoco está en el JavaDoc), terminé deduciéndola del Documentación CLI, que tiene otras opciones de ubicación documentadas.Ver el List configuration options
sección en los documentos.Tampoco es obvio cómo obtener las definiciones de funciones de otro módulo de un proyecto Maven de múltiples módulos.
Esto es lo que me impulsó (ejecutando desde IDE y línea de comando) en un proyecto de múltiples módulos de Maven.
@CucumberOptions(
features = {"classpath:product"},
//...
)
public class RunCukesTest extends AbstractTestNGSpringContextTests {
donde estaban ubicados mis archivos de características
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
...
Me agrada no ver src/test/resources
en el camino.Tenga en cuenta que no hay guía /
en el camino.Usar el classpath es menos frágil, porque el classpath (en lugar del directorio de trabajo actual) debe estar bien definido.
Puedes usar
@CucumberOptions(
format = "pretty",
tags = {"~@Ignore"},
features = "src/test/resources/com/" //refer to Feature file
)
para escanear todos los archivos de características en el paquete
Ok, sólo puedo poner esto el lunes por la mañana...El diseño del directorio que utilicé no era correcto, olvidé colocar las funciones del pepino en subdirectorios que coincidieran con la estructura de mi paquete.
Asegúrese de crear los directorios de paquetes necesarios también en src/test/resources/
!
Una vez que uses
import cucumber.api.CucumberOptions;
Deberá agregar lo siguiente a su pom.xml; de lo contrario, la "prueba mvn" no funcionará.Y sólo puedes ejecutar tus pruebas desde el IDE.Ver: 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>
O simplemente podrías construir tus argumentos de opciones de pepino, como en https://cucumber.io/docs/reference/jvm#cli-runner descrito y páselo a pepino.api.cli.Main.run().Este es un pequeño ejemplo:
String arg = "classpath:MyFeature.feature --dry-run";
String[] args = arg.split(" ");
cucumber.api.cli.Main.run(args, Thread.currentThread().getContextClassLoader());
y úselo en su prueba JUnit.Por lo tanto, no es necesario crear una clase separada para cada clase de prueba solo con otros argumentos.
Al colocar el archivo de características en src/prueba/java donde el corredor y los pasos archivan o colocándolo src/principal/java el problema se resolverá.
No olvides decir gracias.:)