Framework de pruebas automatizadas para la aplicacion de Ticketing, desarrollado con Serenity BDD, Screenplay y Cucumber.
- Serenity BDD 5.3.2 - Framework de reportes y integracion
- Serenity Screenplay - Patron de diseno Actor-Task
- Cucumber 7.34.2 - BDD con Gherkin
- Selenium WebDriver - Automatizacion de navegador
- Gradle 8.10 - Gestion de build y dependencias
src/
├── main/
│ └── java/
│ └── com/ticketing/
│ ├── tasks/ # Tareas (Screenplay)
│ ├── questions/ # Preguntas al UI
│ ├── ui/ # Page Objects y Selectors
│ └── interactions/ # Interacciones especiales
└── test/
├── java/
│ └── com/ticketing/
│ ├── stepdefinitions/ # Step definitions de Cucumber
│ └── runners/ # Test runners
└── resources/
├── features/ # Archivos .feature (Gherkin)
└── serenity.conf # Configuracion de Serenity
| Tag | Escenario | Descripcion |
|---|---|---|
@admin |
Admin Event Management | Suite de pruebas para gestion de eventos |
@edit-event |
Admin edits an existing event | Verifica la edicion de un evento existente |
@generate-seats |
Admin generates seats for an event | Verifica la generacion de asientos |
@create-event |
Admin attempts to create event with invalid data | Verifica validacion de campos obligatorios |
- Java 21 instalado y configurado en PATH
- Google Chrome instalado
- ChromeDriver compatible con la version de Chrome (manejado automaticamente por WebDriverManager)
gradle clean testgradle test -Dcucumber.filter.tags="@edit-event"
gradle test -Dcucumber.filter.tags="@generate-seats"
gradle test -Dcucumber.filter.tags="@create-event"gradle test -Dcucumber.filter.tags="@admin and @edit-event"Los reportes de Serenity se generan automaticamente en:
target/site/serenity/index.html
Para abrir en el navegador:
# Linux
xdg-open target/site/serenity/index.html
# macOS
open target/site/serenity/index.html
# Windows
start target/site/serenity/index.htmlArchivo principal de configuracion ubicado en la raiz del proyecto.
| Propiedad | Descripcion | Valor por Defecto |
|---|---|---|
webdriver.driver |
Navegador a usar | chrome |
webdriver.wait.for.timeout |
Tiempo de espera global | 30000 ms |
webdriver.timeouts.implicitlywait |
Tiempo de espera implicito | 5000 ms |
webdriver.base.url |
URL base de la aplicacion | http://localhost:3000 |
serenity.take.screenshots |
Captura de pantallas | AFTER_EACH_STEP |
El framework soporta multiples ambientes:
environments {
default {
ticketing.url = "http://localhost:3000"
}
staging {
ticketing.url = "https://staging.ticketing.com"
}
production {
ticketing.url = "https://ticketing.com"
}
}Para ejecutar contra un ambiente especifico:
gradle test -Denvironment=stagingchrome {
switches = "--no-sandbox,--disable-dev-shm-usage,--disable-extensions,--disable-gpu,--window-size=1920,1080"
}El proyecto utiliza el patron Screenplay, donde:
- Actors (Actores): Usuarios que realizan acciones
- Tasks (Tareas): Acciones que los actores realizan
- Questions (Preguntas): Consultas al estado de la aplicacion
- Interactions (Interacciones): Acciones de bajo nivel con el navegador
OnStage.theActorInTheSpotlight().attemptsTo(
Click.on(AdminEventsPage.CREATE_BUTTON),
WaitUntil.the(AdminEventFormPage.EVENT_NAME_INPUT, isVisible()).forNoMoreThan(10).seconds()
);Verificar que el archivo serenity.conf tenga las propiedades de ambiente configuradas correctamente y que el ambiente seleccionado exista.
- El elemento no se encuentra en el DOM. Verificar que el locator sea correcto.
- El modal/pagina no cargo completamente. Agregar
WaitUntilantes de interactuar.
Limpiar cache de Gradle:
rm -rf ~/.gradle/caches/modules-2/files-2.1/org.seleniumhq.selenium
gradle clean test# Limpiar build y reportes
gradle clean
# Ejecutar solo compile (sin tests)
gradle compileJava compileTestJava
# Ver version de Gradle
gradle --version
# Forzar actualizacion de dependencias
gradle --refresh-dependencies test- Los tests ejecutan contra
http://localhost:3000por defecto - El navegador Chrome se maximiza automaticamente
- Se capturan pantallas en cada paso (
AFTER_EACH_STEP) - El navegador se reinicia por escenario (
restart.the.browser.each.scenario = false)