|
1 | | -# REST Assured API Testing |
| 1 | +# REST Assured API Testing — Suite de Automatización |
2 | 2 |
|
3 | | - Suite de automatización de pruebas de API construido con Java + Rest Assured + TestNG + Allure. |
| 3 | +> Proyecto de automatización de pruebas de API construido con Java, RestAssured y TestNG, |
| 4 | +> con pipeline CI/CD en GitHub Actions y reportes Allure publicados automáticamente. |
4 | 5 |
|
5 | | -## 🔧 Stack técnico |
| 6 | +🔗 **[Ver reporte Allure en vivo →](https://ipanaque94.github.io/RestAssured3APIS)** |
| 7 | + |
| 8 | +--- |
| 9 | + |
| 10 | +## ¿Por qué existe este proyecto? |
| 11 | + |
| 12 | +Cuando empecé a aprender QA Automation me di cuenta de que la mayoría de los proyectos |
| 13 | +de práctica prueban una sola API con 5 tests. Quería construir algo más cercano a lo que |
| 14 | +se hace en una empresa real: múltiples APIs, suites organizadas por propósito, pipeline |
| 15 | +CI/CD que corre automáticamente y reportes que cualquier stakeholder pueda leer sin |
| 16 | +entrar al código. |
| 17 | + |
| 18 | +Este proyecto prueba **4 APIs distintas** (REST y SOAP), tiene **8 suites independientes** |
| 19 | +y un pipeline que publica el reporte consolidado en GitHub Pages en cada push. |
| 20 | + |
| 21 | +--- |
| 22 | + |
| 23 | +## ¿Qué se prueba y por qué? |
| 24 | + |
| 25 | +| API | Protocolo | ¿Qué valida? | |
| 26 | +|---|---|---| |
| 27 | +| [Simple Books API](https://simple-books-api.glitch.me) | REST + Auth | Flujo completo con autenticación, CRUD de órdenes, validación de schema JSON | |
| 28 | +| [Rick and Morty API](https://rickandmortyapi.com) | REST público | Validación de campos simples y anidados con JsonPath | |
| 29 | +| [JSONPlaceholder](https://jsonplaceholder.typicode.com) | REST público | Operaciones CRUD: GET, POST, PUT, DELETE | |
| 30 | +| [DataAccess](https://www.dataaccess.com) | SOAP/XML | Consumo de servicio SOAP con validación de respuesta XML | |
| 31 | + |
| 32 | +La elección de estas APIs no fue casual. Simple Books tiene autenticación real con tokens, |
| 33 | +lo que permitió cubrir seguridad, manejo de errores y flujos autenticados. JSONPlaceholder |
| 34 | +cubre las operaciones HTTP básicas. SOAP está presente porque muchas empresas todavía |
| 35 | +tienen servicios legacy con ese protocolo. |
| 36 | + |
| 37 | +--- |
| 38 | + |
| 39 | +## Stack técnico |
6 | 40 |
|
7 | 41 | | Herramienta | Versión | Uso | |
8 | 42 | |---|---|---| |
9 | 43 | | Java | 17 | Lenguaje base | |
10 | | -| Rest Assured | 5.3.1 | API Testing | |
11 | | -| TestNG | 7.10.2 | Test runner | |
12 | | -| Allure | 2.25.0 | Reportes | |
13 | | -| Gradle | 9.1.0 | Build tool | |
14 | | -| GitHub Actions | - | CI/CD | |
| 44 | +| RestAssured | 5.3.1 | Cliente HTTP para pruebas de API | |
| 45 | +| TestNG | 7.10.2 | Framework de pruebas con soporte de grupos y DataProviders | |
| 46 | +| Allure | 2.25.0 | Reportes interactivos con trazabilidad completa | |
| 47 | +| Jackson | 2.17.1 | Serialización/deserialización de objetos Java ↔ JSON | |
| 48 | +| Gradle | 9.1.0 | Build y gestión de dependencias | |
| 49 | +| GitHub Actions | — | CI/CD con jobs independientes por suite | |
| 50 | + |
| 51 | +--- |
| 52 | + |
| 53 | +## Estructura del proyecto |
15 | 54 |
|
16 | | -## 📁 Estructura del proyecto |
17 | 55 | ``` |
18 | 56 | src/test/java/APITests/ |
19 | | -├── auth/ → Tests de autenticación |
20 | | -├── books/ → Tests de Simple Books API |
21 | | -├── dataaccess/ → Tests SOAP |
22 | | -├── jsonplaceholder/ → Tests JsonPlaceholder API |
23 | | -├── rickandmorty/ → Tests Rick & Morty API |
24 | | -├── baseUrl/ → Clases base reutilizables |
25 | | -└── utils/ → Utilidades y configuración |
| 57 | +├── auth/ → Registro de clientes y obtención de token |
| 58 | +├── books/ → CRUD de libros y órdenes (Simple Books API) |
| 59 | +│ ├── BooksTest.java |
| 60 | +│ ├── OrdersTest.java |
| 61 | +│ ├── BooksSchemaValidation.java |
| 62 | +│ └── IdempotenciaTest.java |
| 63 | +├── rickandmorty/ → Validación de personajes |
| 64 | +├── jsonplaceholder/ → Operaciones CRUD |
| 65 | +├── dataaccess/ → Servicio SOAP |
| 66 | +├── baseUrl/ → Clases base reutilizables (una por API) |
| 67 | +└── utils/ |
| 68 | + ├── Config.java → Lee URLs desde env vars, -D flags o config.properties |
| 69 | + ├── Order.java |
| 70 | + └── OrderResponse.java |
| 71 | +
|
| 72 | +src/test/resources/ |
| 73 | +├── TestNG.xml → Suite completa |
| 74 | +├── TestngSmoke.xml |
| 75 | +├── TestngRegression.xml |
| 76 | +├── TestngContract.xml |
| 77 | +├── TestngSecurity.xml |
| 78 | +├── TestngNegative.xml |
| 79 | +├── TestngIdempotencia.xml |
| 80 | +├── TestngPerformance.xml |
| 81 | +├── TestsngSoap.xml |
| 82 | +├── config.properties |
| 83 | +└── schemas/ |
| 84 | + └── books-schemas.json → Schema JSON para Contract Testing |
26 | 85 | ``` |
27 | 86 |
|
28 | | -## 🧪 Suites de prueba |
| 87 | +--- |
| 88 | + |
| 89 | +## Suites de prueba |
| 90 | + |
| 91 | +Cada suite tiene un propósito claro y corre de forma independiente: |
| 92 | + |
| 93 | +| Suite | Propósito | Qué valida | |
| 94 | +|---|---|---| |
| 95 | +| 🔥 **Smoke** | Verificación rápida post-deploy | El sistema responde y los flujos críticos funcionan | |
| 96 | +| 🔁 **Regression** | Cobertura funcional completa | Que nada se rompió con los últimos cambios | |
| 97 | +| 📋 **Contract** | Validación de esquema JSON | La estructura de la respuesta no cambió sin aviso | |
| 98 | +| 🔒 **Security** | Autenticación y autorización | Tokens inválidos retornan 401, acceso correcto retorna 200 | |
| 99 | +| ❌ **Negative** | Manejo de errores | El sistema responde correctamente ante datos inválidos | |
| 100 | +| 🔄 **Idempotencia** | Métodos HTTP idempotentes | PATCH repetido = mismo resultado, DELETE repetido = 404 | |
| 101 | +| ⚡ **Performance** | Tiempos de respuesta | El endpoint responde en menos de 2000ms | |
| 102 | +| 🧼 **SOAP** | Servicios legacy XML | El servicio SOAP convierte números a palabras correctamente | |
| 103 | + |
| 104 | +--- |
29 | 105 |
|
30 | | -| Suite | Descripción | |
31 | | -|---|---| |
32 | | -| Smoke | Tests críticos de verificación rápida | |
33 | | -| Regression | Suite completa de regresión | |
34 | | -| Contract | Validación de esquemas JSON | |
35 | | -| Security | Tests de autenticación y autorización | |
36 | | -| Negative | Casos negativos y manejo de errores | |
37 | | -| Idempotencia | Verificación de métodos idempotentes | |
38 | | -| Performance | Validación de tiempos de respuesta | |
39 | | -| SOAP | Tests de servicios SOAP | |
| 106 | +## Cómo ejecutar |
40 | 107 |
|
41 | | -## 🚀 Cómo ejecutar |
| 108 | +**Requisitos:** Java 17, Gradle 9+ |
42 | 109 |
|
| 110 | +```bash |
43 | 111 | # Todas las suites |
44 | | -.\gradlew clean test --no-configuration-cache |
| 112 | +./gradlew clean test |
| 113 | + |
| 114 | +# Suite específica |
| 115 | +./gradlew clean test -Dsuite=Smoke |
| 116 | +./gradlew clean test -Dsuite=Regression |
| 117 | +./gradlew clean test -Dsuite=Security |
| 118 | +./gradlew clean test -Dsuite=Negative |
| 119 | +./gradlew clean test -Dsuite=Contract |
| 120 | +./gradlew clean test -Dsuite=Idempotencia |
| 121 | +./gradlew clean test -Dsuite=Performance |
| 122 | +./gradlew clean test -Dsuite=SOAP |
45 | 123 | ``` |
46 | 124 |
|
47 | | -## 📊 Reporte Allure |
48 | | -# Ver El Reporte |
| 125 | +**Ver el reporte Allure localmente:** |
| 126 | +```bash |
49 | 127 | allure serve build/allure-results |
50 | 128 | ``` |
51 | 129 |
|
52 | | -Ver reporte online: [GitHub Pages](https://ipanaque94.github.io/RestAssured3APIS) |
| 130 | +--- |
| 131 | + |
| 132 | +## Pipeline CI/CD |
| 133 | + |
| 134 | +El pipeline corre automáticamente en cada push a `main`. Los jobs tienen dependencias |
| 135 | +para que Smoke sea el primer gate — si falla, los demás no corren innecesariamente: |
| 136 | + |
| 137 | +``` |
| 138 | +Push → 🔥 Smoke |
| 139 | + ├── 🔁 Regression ──→ 🔄 Idempotencia |
| 140 | + │ └──→ ⚡ Performance |
| 141 | + ├── 📋 Contract |
| 142 | + ├── 🔒 Security |
| 143 | + ├── ❌ Negative |
| 144 | + └── 🧼 SOAP |
| 145 | + └── 📊 Reporte consolidado → GitHub Pages |
| 146 | +``` |
| 147 | + |
| 148 | +Cada job publica sus resultados como artefacto. Al final, el job `publish-report` |
| 149 | +descarga todos los resultados, genera un reporte Allure consolidado y lo publica |
| 150 | +automáticamente en GitHub Pages. |
| 151 | + |
| 152 | +--- |
| 153 | + |
| 154 | +## Decisiones de diseño |
| 155 | + |
| 156 | +Estas decisiones las tomé pensando en mantenibilidad y escalabilidad — no solo en |
| 157 | +hacer que los tests pasen: |
| 158 | + |
| 159 | +**Clase base por API (`BaseBooksTest`, `BaseRickMorty`, etc.)** |
| 160 | +Cada API tiene su propia clase base con la configuración de URL y el `RequestSpec`. |
| 161 | +Si cambia la URL de una API, se modifica en un solo lugar. |
| 162 | + |
| 163 | +**`Config.java` con prioridad de configuración** |
| 164 | +Lee la URL en este orden: variable de entorno → system property → `config.properties`. |
| 165 | +Esto permite que CI inyecte URLs distintas por ambiente sin tocar el código. |
| 166 | + |
| 167 | +**`@BeforeClass(alwaysRun = true)` con flag `initialized`** |
| 168 | +TestNG crea una nueva instancia de la clase por cada suite que la incluye. Sin el flag |
| 169 | +`static initialized`, el setup se ejecutaría múltiples veces y agotaría el rate limit |
| 170 | +de la API al obtener el token. |
| 171 | + |
| 172 | +**Un XML por suite en lugar de grupos en un solo XML** |
| 173 | +Permite correr cada suite con un comando simple (`-Dsuite=Smoke`) y que el CI lance |
| 174 | +jobs completamente independientes sin configuración adicional. |
| 175 | + |
| 176 | +--- |
| 177 | + |
| 178 | +## Qué aprendí construyendo esto |
| 179 | + |
| 180 | +Más allá del código, este proyecto me enseñó cosas que no están en los tutoriales: |
53 | 181 |
|
54 | | -## ⚙️ CI/CD |
| 182 | +- El `@BeforeClass` sin `alwaysRun = true` se salta cuando TestNG corre grupos específicos, |
| 183 | + dejando el `spec` nulo y fallando con un error confuso de "Specification cannot be null" |
| 184 | +- `simple-books-api.click` está bloqueado por los runners de GitHub Actions — tuve que |
| 185 | + cambiar a `simple-books-api.glitch.me`, que es la misma API en un host diferente |
| 186 | +- El `doFirst { delete }` de Gradle 9 es incompatible con el configuration cache — |
| 187 | + la solución es usar `./gradlew clean test` en lugar de borrar el directorio manualmente |
| 188 | +- Los headers duplicados entre el `spec` y el `given()` pueden causar errores 400 |
| 189 | + silenciosos en algunas APIs |
55 | 190 |
|
56 | | -El pipeline de GitHub Actions corre automáticamente en cada push: |
| 191 | +--- |
57 | 192 |
|
58 | | -1. 🔥 Smoke Tests |
59 | | -2. 🔁 Regression + 📋 Contract + 🔒 Security + ❌ Negative + 🧼 SOAP |
60 | | -3. 🔄 Idempotencia + ⚡ Performance |
61 | | -4. 📊 Reporte Consolidado → GitHub Pages |
| 193 | +## Autor |
62 | 194 |
|
63 | | -## 📚 Curso base |
| 195 | +**Enoc Ipanaque** |
| 196 | +[LinkedIn](www.linkedin.com/in/enoc-isaac-ipanaque-rodas-b3729a283) · [GitHub](https://github.com/ipanaque94) |
64 | 197 |
|
65 | | -Esta Suite de API testing fue construido sobre los conocimientos adquiridos en el curso |
66 | | -**REST Assured Avanzado** de [Free Range Testers](https://www.freerangetesters.com) en Udemy |
| 198 | +Estudiante de QA Automation en proceso de certificación ISTQB CTFL. |
| 199 | +Construido sobre los conocimientos del curso **REST Assured Avanzado** |
| 200 | +de [Free Range Testers](https://www.freerangetesters.com). |
0 commit comments