Integración de Cucumber con Spring en Aplicaciones Java

¿Cómo integrar Cucumber con Spring en una aplicación Java?

La integración de Cucumber con Spring permite a los desarrolladores de Java aplicar la metodología BDD (Desarrollo Guiado por Comportamiento) de una manera efectiva. En este blog, exploraremos cómo configurar esta integración, desde las dependencias necesarias hasta la creación de pruebas funcionales. Aprenderemos a implementar pruebas automatizadas que no solo son eficaces, sino también fáciles de entender para todas las partes interesadas, incluyendo las no técnicas.



1. Descripción general

Cucumber es un marco de pruebas muy poderoso que está escrito en el lenguaje de programación Ruby y sigue la metodología BDD. Permite a los desarrolladores redactar casos de uso de alto nivel en texto plano que pueden ser verificados por partes interesadas no técnicas, y transformarlos en pruebas ejecutables, escritas en un lenguaje que se llama Gherkin. La integración de Cucumber con Spring está diseñada para facilitar la automatización de pruebas. Una vez que tengamos las pruebas de Cucumber integradas con Spring, podremos ejecutarlas junto con la construcción de Maven. Para más detalles sobre Cucumber, consulta este artículo.



2. Dependencias de Maven

Para comenzar a utilizar la integración de Cucumber con Spring, debemos definir las dependencias de Maven, comenzando con la dependencia de Cucumber-JVM:

<dependency>
    <groupId>io.cucumber</groupId>
    <artifactId>cucumber-java</artifactId>
    <version>7.14.0</version>
    <scope>test</scope>
</dependency>

Podemos encontrar la versión más reciente de Cucumber JVM aquí.

A continuación, agregamos la dependencia de JUnit y Cucumber:

<dependency>
    <groupId>io.cucumber</groupId>
    <artifactId>cucumber-junit</artifactId>
    <version>7.14.0</version>
    <scope>test</scope>
</dependency>

La versión más actual de Cucumber JUnit se puede encontrar aquí.

Y finalmente, la dependencia de Spring y Cucumber:

<dependency>
    <groupId>io.cucumber</groupId>
    <artifactId>cucumber-spring</artifactId>
    <version>7.14.0</version>
    <scope>test</scope>
</dependency>

La versión más reciente de Cucumber Spring puede consultarse aquí.



3. Configuración

A continuación, veremos cómo integrar Cucumber en una aplicación de Spring. Primero, crearemos una aplicación de Spring Boot. Para ello, seguiremos el artículo sobre la configuración de aplicaciones Spring Boot. Luego, crearemos un servicio REST y escribiremos la prueba de Cucumber para ello.



3.1. Controlador REST

Primero, creemos un controlador simple:

@RestController
public class VersionController {
    @GetMapping("/version")
    public String getVersion() {
        return "1.0";
    }
}


3.2. Definiciones de pasos de Cucumber

Para ejecutar nuestras pruebas de Cucumber con JUnit, solo necesitamos crear una clase vacía con la anotación @RunWith(Cucumber.class):

@RunWith(Cucumber.class)
@CucumberOptions(features = "src/test/resources")
public class CucumberIntegrationTest {
}

En esta anotación @CucumberOptions, especificamos la ubicación del archivo Gherkin, también conocido como archivo de características.

A continuación, creamos un archivo de características de Cucumber:

Feature: the version can be retrieved
  Scenario: client makes call to GET /version
    When the client calls /version
    Then the client receives status code of 200
    And the client receives server version 1.0

El escenario es hacer una llamada GET al servicio REST en la URL /version y verificar la respuesta.

Después, necesitamos crear un código enlazador. Estos son métodos que conectan un paso de Gherkin con código Java. Podemos usar Cucumber Expressions o expresiones regulares dentro de las anotaciones. En este caso, usaremos expresiones regulares:

@When("^the client calls /version$")
public void the_client_issues_GET_version() throws Throwable{
    executeGet("http://localhost:8080/version");
}

@Then("^the client receives status code of (\\d+)$")
public void the_client_receives_status_code_of(int statusCode) throws Throwable {
    HttpStatus currentStatusCode = latestResponse.getTheResponse().getStatusCode();
    assertThat("status code is incorrect : " + 
    latestResponse.getBody(), currentStatusCode.value(), is(statusCode));
}

@And("^the client receives server version (.+)$")
public void the_client_receives_server_version_body(String version) throws Throwable {
    assertThat(latestResponse.getBody(), is(version));
}


Integración de pruebas de Cucumber con el contexto de Spring

Para esto, crearemos una nueva clase y la anotaremos con @SpringBootTest y @CucumberContextConfiguration:

@CucumberContextConfiguration
@SpringBootTest
public class SpringIntegrationTest {
    // implementación de executeGet
}

Ahora todas las definiciones de Cucumber pueden ir en una clase Java separada que extiende SpringIntegrationTest:

public class StepDefs extends SpringIntegrationTest {
   
    @When("^the client calls /version$")
    public void the_client_issues_GET_version() throws Throwable {
        executeGet("http://localhost:8080/version");
    }
}

Estamos listos para ejecutar la prueba ahora.



### Ejecución de la prueba

Finalmente, podemos realizar una rápida ejecución a través de la línea de comandos, ejecutando simplemente:

mvn clean install -Pintegration-lite-first

Maven ejecutará las pruebas de integración y mostrará los resultados en la consola.

3 Scenarios ([32m3 passed[0m)
9 Steps ([32m9 passed[0m)
0m1.054s

Tests run: 12, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 9.283 sec - in
  com.baeldung.CucumberTest
2016-07-30 06:28:20.142  INFO 732 --- [Thread-2] AnnotationConfigEmbeddedWebApplicationContext :
  Closing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext:
  startup date [Sat Jul 30 06:28:12 CDT 2016]; root of context hierarchy

Results :

Tests run: 12, Failures: 0, Errors: 0, Skipped: 0


4. Conclusión

Habiendo configurado Cucumber con Spring, es útil utilizar componentes configurados por Spring en pruebas BDD. Este es un sencillo guía para integrar las pruebas de Cucumber en una aplicación Spring Boot. Implementar esta combinación no solo aumentará la calidad de tus pruebas, sino que también facilitará la colaboración con partes interesadas de diferentes niveles técnicos.



Consejos prácticos:

  • Mantén tus pruebas actualizadas: Los cambios en la lógica de negocio deben reflejarse en las pruebas.
  • Utiliza etiquetas en tus pruebas Cucumber: Esto te permite filtrar y ejecutar grupos específicos de pruebas.
  • Escribe casos de prueba claros y descriptivos: Asegúrate de que cada escenario sea comprensible incluso para quienes no son técnicos.
  • Integra tu CI/CD con las pruebas Cucumber: Asegúrate de que se ejecuten automáticamente para detectar errores en las etapas tempranas del desarrollo.

Al seguir esta guía, podrás implementar pruebas efectivas y colaborativas en tus proyectos Java. ¡Feliz codificación!