We welcome contributions to the Makers BTG Tests framework! This guide will help you set up your development environment, understand our development workflow, and submit high-quality contributions.
Create a new feature file in src/test/resources/features/:
#language:esCaracterística: Login de usuario en la aplicacion @test @login Escenario: [Happy Path] Login exitoso con credenciales validas Dado el usuario navega a la pagina de login Cuando ingresa usuario "admin" y password "admin123" Y hace click en el boton Ingresar Entonces el usuario es redirigido al dashboard
package org.btg.practual.stepDefinitions;import io.cucumber.java.es.*;public class LoginUsuarioSteps { @Dado("el usuario navega a la pagina de login") public void el_usuario_navega_a_la_pagina_de_login() { // Implementation } @Cuando("ingresa usuario {string} y password {string}") public void ingresa_usuario_y_password(String usuario, String password) { // Implementation } @Cuando("hace click en el boton Ingresar") public void hace_click_en_el_boton_ingresar() { // Implementation } @Entonces("el usuario es redirigido al dashboard") public void el_usuario_es_redirigido_al_dashboard() { // Assertion }}
@test @loginEscenario: [Negative] Login fallido con credenciales invalidas Dado el usuario navega a la pagina de login Cuando ingresa usuario "admin" y password "wrongpassword" Y hace click en el boton Ingresar Entonces se muestra mensaje de error "Credenciales invalidas"
// ✅ Good - Atomic and reusable@Cuando("hace click en el boton {string}")public void hace_click_en_el_boton(String nombreBoton) { // Generic button click logic}// ❌ Bad - Too specific, not reusable@Cuando("hace click en el boton de generar reporte en la seccion de reportes")public void hace_click_en_el_boton_de_generar_reporte_en_la_seccion_de_reportes() { // Too specific}
Use Parameterization
Leverage Cucumber expressions for flexible step definitions:
// String parameters@Dado("el usuario ingresa {string} en el campo {string}")public void el_usuario_ingresa_en_el_campo(String valor, String campo) { // Implementation}// Integer parameters@Cuando("selecciona {int} items de la lista")public void selecciona_items_de_la_lista(Integer cantidad) { // Implementation}// Optional parameters@Entonces("se muestra(n) {int} resultado(s)")public void se_muestran_resultados(Integer cantidad) { // Implementation}
Implement Proper Waits
Always wait for elements before interacting:
import org.openqa.selenium.support.ui.WebDriverWait;import org.openqa.selenium.support.ui.ExpectedConditions;import java.time.Duration;public class CommonSteps { private WebDriver driver; private WebDriverWait wait; public CommonSteps(WebDriver driver) { this.driver = driver; this.wait = new WebDriverWait(driver, Duration.ofSeconds(10)); } @Cuando("hace click en {string}") public void hace_click_en(String elemento) { WebElement el = wait.until( ExpectedConditions.elementToBeClickable( By.xpath("//button[text()='" + elemento + "']") ) ); el.click(); }}
Add Meaningful Assertions
Use AssertJ for readable assertions:
import static org.assertj.core.api.Assertions.*;@Entonces("el reporte {string} se genera exitosamente")public void el_reporte_se_genera_exitosamente(String reporteId) { String mensajeExito = obtenerMensajeExito(); assertThat(mensajeExito) .as("Mensaje de exito del reporte") .contains("generado exitosamente") .contains(reporteId);}
@test @reportesEsquema del escenario: [Happy Path] Generacion exitosa de multiples reportes 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 |
## Descripción[Describe los cambios realizados]## Tipo de cambio- [ ] Nueva funcionalidad (feat)- [ ] Corrección de bug (fix)- [ ] Actualización de tests (test)- [ ] Documentación (docs)- [ ] Refactorización (refactor)## ¿Cómo se ha probado?[Describe las pruebas realizadas]## Checklist- [ ] Mi código sigue las convenciones del proyecto- [ ] He realizado pruebas locales- [ ] Todos los tests pasan exitosamente- [ ] He actualizado la documentación si es necesario- [ ] Los reportes Serenity se generan correctamente## Capturas de pantalla (si aplica)[Agregar capturas de pantalla de reportes o funcionalidad]