Este proyecto contiene una batería de pruebas automatizadas para APIs RESTful utilizando el Karate Framework, orientado a validar múltiples métodos HTTP, estructuras de respuesta, tiempos de respuesta y flujos comunes de prueba. Es ideal como base educativa, demostración de habilidades en automatización, o punto de partida para proyectos más grandes.
- Introducción
- Tecnologías Utilizadas
- Uso de Tags en Features
- Estructura de un Feature
- Palabras Reservadas en Karate
- Uso de Background
- Método GET
- Método POST
- Scenario Outline
- Método PUT
- Método PATCH
- Validaciones de Tiempo y Assert
- Buenas Prácticas
Karate es un framework que permite escribir pruebas de APIs de forma sencilla utilizando una sintaxis tipo Gherkin. Este proyecto busca demostrar:
- Ejecución de features y escenarios etiquetados.
- Validaciones de status, contenido y tiempos de respuesta.
- Reutilización de datos y lógica.
- Envío de requests y verificación de respuestas en múltiples métodos HTTP.
- Karate Framework 1.4.0: Framework de testing para APIs que combina la sintaxis Gherkin con capacidades avanzadas de testing REST/GraphQL.
- JUnit Jupiter API 5.13.1: Framework de testing para Java que proporciona las anotaciones y funcionalidades básicas para ejecutar tests.
- JUnit Jupiter Engine 5.13.1: Motor de ejecución que permite ejecutar tests JUnit 5 en tiempo de ejecución.
- Gherkin: Lenguaje de dominio específico (DSL) para escribir casos de prueba en formato legible por humanos usando palabras clave como
Given,When,Then. - Cucumber (integrado en Karate): Framework BDD (Behavior-Driven Development) que permite ejecutar especificaciones escritas en Gherkin. Karate incluye su propia implementación de Cucumber optimizada para testing de APIs.
- Thymeleaf (incluido en Karate): Motor de plantillas que Karate utiliza internamente para generar reportes HTML automáticos después de la ejecución de los tests, proporcionando visualización detallada de resultados, métricas y trazabilidad.
- Integración nativa: Todas las tecnologías están integradas dentro de Karate, eliminando la necesidad de configuraciones complejas.
- Reportes automáticos: Generación automática de reportes HTML con métricas detalladas, tiempos de ejecución y resultados visuales.
- Sintaxis BDD: Permite escribir tests en lenguaje natural comprensible por stakeholders técnicos y no técnicos.
@tag_features
Feature: Validación del funcionamiento de tags
@test_get
Scenario: Obtener usuario por ID
Given ...Los tags permiten agrupar escenarios o features para ejecutarlos de forma selectiva.
Se pueden usar múltiples tags y compartir entre features distintos.
Feature: Define una funcionalidad a probar
Scenario: Caso de prueba
Given: Paso inicial
When: Acción a ejecutar
Then: Resultado esperado
And: Paso adicional
But: Condición que restringe| Categoría | Palabras |
|---|---|
| HTTP y Requests | url, method, params, headers, request, cookie |
| Validación de respuestas | response, status, match, contains, assert, responseTime |
| Lógica de ejecución | def, eval, delay, retry, call, callSingle, background |
| Funciones karate. | karate.callSingle, karate.configure, karate.embed, karate.env, karate.feature, karate.info, karate.match, karate.read, karate.retry, karate.scenario, karate.get |
Background:
* headers { 'x-api-key': 'reqres-free-v1' }
Given url 'https://reqres.in/api/users/'Los Background definen pasos comunes para todos los escenarios de un feature.
Se puede usar * en lugar de Given para mayor flexibilidad.
Permiten declarar headers, variables (def), URL base y lógica compartida.
Background:
Given url 'https://reqres.in/api/users/'
Scenario: Obtener usuario por ID
And path '2'
When method get
Then status 200* def data = response.data
* def firstName = data[0].first_name
* def lastName = data[0].last_name
* match response.data[0].first_name == 'George'And param page = 2
And params { page: 2, per_page: 6 }Scenario: Crear usuario
Given url 'https://reqres.in/api/users'
And request { "name": "morpheus", "job": "leader" }
When method post
Then status 201
And match response.id == '#present'Background:
* def solicitud = { "name": "morpheus", "job": "leader" }
Scenario:
* solicitud.name = "HectorGonzalezM"
And request solicitudScenario:
* def bodyRequest = read('../jsons/posts/create_user.json')
And request bodyRequestPermite ejecutar un mismo escenario con distintos datos:
Scenario Outline: Crear múltiples usuarios
Given url 'https://reqres.in/api/users'
And request { "name": <name>, "job": <job> }
When method post
Then status 201
Examples:
| name | job |
| HectorGonzalezM | Programador|
| Yanira Fontalba | Gerente |
| Juan Perez | Analista |Scenario: Actualizar usuario
Given url 'https://reqres.in/api/users/2'
And request { "name": "morpheus", "job": "zion resident" }
When method put
Then match response contains { updatedAt: '#? _ >= "2025-06-22"' }Scenario: Actualización parcial
Given url 'https://reqres.in/api/users/2'
And request { "name": "morpheus", "job": "zion resident" }
When method patch
And def fecha_actual = karate.get('java.time.LocalDate.now().toString()')
Then match response == { name: "morpheus", job: "zion resident", updatedAt: '#? _ >= "#(fecha_actual)"' }Scenario: Tiempo de respuesta
Given url 'https://reqres.in/api/users/2'
When method get
Then assert responseTime < 2000Otras validaciones con assert:
* assert response.status == 200
* assert response.data[0].first_name == 'George'✅ Mantén el orden lógico Given → When → Then
✅ Usa Background para pasos comunes
✅ Reutiliza lógica con call, read, y archivos externos
✅ Valida estructura, tipos y tiempos
✅ Cuida indentación y sintaxis sensible a mayúsculas
✅ Usa Scenario Outline para pruebas data-driven
Héctor González