This page provides a complete walkthrough of the GeneracionReporte test, showing how the feature file and step definitions work together to create an end-to-end automated test.
Let’s start with the complete feature file:Location: src/test/resources/features/GeneracionReporte.feature
#language:esCaracterística: Generación de reportes desde la web de Chronos @test Esquema del escenario: [Happy Path] Generacion exitosa de reporte Dado el usuario ingresa a la web de Chronos Cuando ingrese los datos del reporte "<report>" para la compañia "<company>" segun la fecha "<report_date>" Entonces se genera el reporte "<report>" de manera exitosa Ejemplos: | report | company | report_date | | 417 | compañia 1 | 2026-02-01 |
Now let’s see the Java implementation:Location: src/test/java/org/btg/practual/stepDefinitions/GeneracionReporteSteps.java
package org.btg.practual.stepDefinitions;import io.cucumber.java.es.Dado;import io.cucumber.java.es.Cuando;import io.cucumber.java.es.Entonces;public class GeneracionReporteSteps { @Dado("el usuario ingresa a la web de Chronos") public void el_usuario_ingresa_a_la_web_de_chronos() { // Write code here that turns the phrase above into concrete actions System.out.println("Step: el usuario ingresa a la web de Chronos"); } @Cuando("ingrese los datos del reporte {string} para la compañia {string} segun la fecha {string}") public void ingrese_los_datos_del_reporte_para_la_compañia_segun_la_fecha(String reporte, String compania, String fecha) { // Write code here that turns the phrase above into concrete actions System.out.println("Step: ingrese los datos del reporte " + reporte + " para la compañia " + compania + " segun la fecha " + fecha); } @Entonces("se genera el reporte {string} de manera exitosa") public void se_genera_el_reporte_de_manera_exitosa(String reporte) { // Write code here that turns the phrase above into concrete actions System.out.println("Step: se genera el reporte " + reporte + " de manera exitosa"); }}
Gherkin: Dado el usuario ingresa a la web de ChronosJava Method: el_usuario_ingresa_a_la_web_de_chronos()Action: Prints “Step: el usuario ingresa a la web de Chronos”Real Implementation Would: Initialize WebDriver, navigate to Chronos URL, verify page loaded
2
Step 2: Action
Gherkin: Cuando ingrese los datos del reporte "417" para la compañia "compañia 1" segun la fecha "2026-02-01"Java Method: ingrese_los_datos_del_reporte_para_la_compañia_segun_la_fecha("417", "compañia 1", "2026-02-01")Action: Prints the step with all three parametersReal Implementation Would: Fill report field with “417”, select “compañia 1” from dropdown, enter date “2026-02-01”, submit form
3
Step 3: Verification
Gherkin: Entonces se genera el reporte "417" de manera exitosaJava Method: se_genera_el_reporte_de_manera_exitosa("417")Action: Prints “Step: se genera el reporte 417 de manera exitosa”Real Implementation Would: Wait for success message, verify report number is “417”, check download link exists
The current implementation uses System.out.println() as placeholder code. In a production test, these would contain actual Selenium WebDriver commands, API calls, or database queries.
When you run this test, you would see output like:
Scenario Outline: [Happy Path] Generacion exitosa de reporte Dado el usuario ingresa a la web de Chronos Cuando ingrese los datos del reporte "417" para la compañia "compañia 1" segun la fecha "2026-02-01" Entonces se genera el reporte "417" de manera exitosaStep: el usuario ingresa a la web de ChronosStep: ingrese los datos del reporte 417 para la compañia compañia 1 segun la fecha 2026-02-01Step: se genera el reporte 417 de manera exitosa1 Scenarios (1 passed)3 Steps (3 passed)
private WebDriver driver;private WebDriverWait wait;@Dado("el usuario ingresa a la web de Chronos")public void el_usuario_ingresa_a_la_web_de_chronos() { driver = new ChromeDriver(); wait = new WebDriverWait(driver, Duration.ofSeconds(10)); driver.get("https://chronos.btg.com"); driver.manage().window().maximize(); wait.until(ExpectedConditions.titleContains("Chronos")); logger.info("Successfully navigated to Chronos web application");}
@Cuando("ingrese los datos del reporte {string} para la compañia {string} segun la fecha {string}")public void ingrese_los_datos_del_reporte_para_la_compañia_segun_la_fecha( String reporte, String compania, String fecha) { // Wait for and fill report number field WebElement reportField = wait.until( ExpectedConditions.presenceOfElementLocated(By.id("reportNumber")) ); reportField.clear(); reportField.sendKeys(reporte); // Select company from dropdown Select companyDropdown = new Select(driver.findElement(By.id("company"))); companyDropdown.selectByVisibleText(compania); // Enter report date WebElement dateField = driver.findElement(By.id("reportDate")); dateField.clear(); dateField.sendKeys(fecha); // Submit the form driver.findElement(By.id("generateButton")).click(); logger.info(String.format("Submitted report generation: %s, %s, %s", reporte, compania, fecha));}
Each step should be able to run independently. Avoid hidden dependencies between steps.Good:
@Dado("el usuario ingresa a la web de Chronos")public void el_usuario_ingresa_a_la_web_de_chronos() { driver = new ChromeDriver(); // Initialize driver in this step driver.get("https://chronos.btg.com");}
Bad:
@Dado("el usuario ingresa a la web de Chronos")public void el_usuario_ingresa_a_la_web_de_chronos() { driver.get("https://chronos.btg.com"); // Assumes driver already exists}
Use Meaningful Assertions
Always include clear assertions with descriptive failure messages.Good:
assertTrue(successMessage.isDisplayed(), "Success message should be displayed after report generation");assertEquals("417", reportNumber, "Report number should match the requested report");
Separate UI logic from test logic for better maintainability.
@Cuando("ingrese los datos del reporte {string} para la compañia {string} segun la fecha {string}")public void ingrese_los_datos_del_reporte_para_la_compañia_segun_la_fecha( String reporte, String compania, String fecha) { // Use Page Object instead of direct WebDriver calls reportGenerationPage.enterReportNumber(reporte); reportGenerationPage.selectCompany(compania); reportGenerationPage.enterDate(fecha); reportGenerationPage.clickGenerate();}
# Run by tagmvn test -Dcucumber.filter.tags="@test"# Run specific feature filemvn test -Dcucumber.features="src/test/resources/features/GeneracionReporte.feature"