Data-driven testing allows you to run the same test scenario multiple times with different input data. In Cucumber, this is achieved using Scenario Outlines (Esquema del escenario in Spanish) combined with Examples tables (Ejemplos).This approach helps you:
Test multiple data combinations without duplicating code
Improve test coverage with minimal effort
Maintain readable, organized test scenarios
Easily add new test cases by adding rows to the Examples table
A regular scenario runs once with hardcoded values:
Escenario: Usuario genera un reporte específico 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 exitosa
A scenario outline uses placeholders and runs once for each row in the Examples table:
Esquema del escenario: Usuario genera reportes para diferentes compañías 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 | | 418 | compañia 2 | 2026-02-15 | | 419 | compañia 3 | 2026-03-01 |
Here’s the actual data-driven test from our framework:
#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 |
This test currently has one row in the Examples table, but you can easily add more rows to test additional scenarios.
Cuando ingrese los datos del reporte "<report>" para la compañia "<company>" segun la fecha "<report_date>"Ejemplos: | report | company | report_date | | 417 | compañia 1 | 2026-02-01 |
@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) { System.out.println("Step: ingrese los datos del reporte " + reporte + " para la compañia " + compania + " segun la fecha " + fecha);}
Column: report → Parameter: reporte → Value: "417"Column: company → Parameter: compania → Value: "compañia 1"Column: report_date → Parameter: fecha → Value: "2026-02-01"
The parameter names in Java (reporte, compania, fecha) don’t need to match the column names (report, company, report_date). What matters is the order and type of parameters.
Let’s expand the GeneracionReporte test to cover more scenarios:
#language:esCaracterística: Generación de reportes desde la web de Chronos @test @regression 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 | | 418 | compañia 2 | 2026-02-15 | | 419 | compañia 1 | 2026-03-01 | | 420 | compañia 3 | 2026-03-15 | | 421 | compañia 2 | 2026-04-01 |
Result: This now runs 5 times with different combinations:
Report 417 for compañia 1 on 2026-02-01
Report 418 for compañia 2 on 2026-02-15
Report 419 for compañia 1 on 2026-03-01
Report 420 for compañia 3 on 2026-03-15
Report 421 for compañia 2 on 2026-04-01
The step definition code doesn’t change at all! Adding more test cases is as simple as adding more rows to the Examples table.
You can have multiple Examples tables for different test scenarios:
Esquema del escenario: Generacion de reportes mensuales 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 @happy-path Ejemplos: Reportes válidos | report | company | report_date | | 417 | compañia 1 | 2026-02-01 | | 418 | compañia 2 | 2026-02-15 | @edge-cases Ejemplos: Fechas límite | report | company | report_date | | 419 | compañia 1 | 2026-12-31 | | 420 | compañia 1 | 2026-01-01 |
Result: Runs 4 times total (2 from first table, 2 from second table)
You can tag individual Examples tables differently to run specific subsets of data.
When running data-driven tests, each row is reported separately:
Scenario Outline: [Happy Path] Generacion exitosa de reporte # Row 1 ✓ 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 exitosaScenario Outline: [Happy Path] Generacion exitosa de reporte # Row 2 ✓ Dado el usuario ingresa a la web de Chronos ✓ Cuando ingrese los datos del reporte "418" para la compañia "compañia 2" segun la fecha "2026-02-15" ✓ Entonces se genera el reporte "418" de manera exitosa2 Scenarios (2 passed)6 Steps (6 passed)
If one row fails, the other rows still execute. This helps you identify which specific data combinations cause failures.
// Step expects 3 parameters@Cuando("ingrese los datos del reporte {string} para la compañia {string} segun la fecha {string}")public void ingrese_datos(String reporte) { // Only 1 parameter!
Solution: Match parameter count and order:
@Cuando("ingrese los datos del reporte {string} para la compañia {string} segun la fecha {string}")public void ingrese_datos(String reporte, String compania, String fecha) { // ✓ All 3 parameters