Introducción
En este artículo automatizo las pruebas funcionales de una API REST en .NET 8 con Newman, el ejecutor de línea de comandos de Postman. Las pruebas corren solas en GitHub Actions en cada cambio y el reporte se publica en la nube con GitHub Pages.
Las pruebas de API verifican que cada endpoint responda lo correcto: el código de estado, los datos, el formato y las reglas de negocio. Postman es la herramienta más conocida para armarlas a mano; Newman permite ejecutar esas mismas colecciones desde la terminal, así que encaja perfecto en un pipeline de CI/CD.
La API y el repositorio público
La aplicación es Banco API, una Minimal API en .NET 8 para manejar cuentas bancarias, con datos en memoria.
Repositorio público del equipo: github.com/viccarretero/banco-api-pruebas. La misma API también se prueba con k6 para medir su rendimiento; eso lo explica mi compañero Gerald Zevallos en su artículo.
| Método | Ruta | Qué hace |
|---|---|---|
| GET | /api/cuentas | Lista las cuentas |
| GET | /api/cuentas/{id} | Obtiene una cuenta (404 si no existe) |
| POST | /api/cuentas | Crea una cuenta |
| POST | /api/cuentas/{id}/depositos | Deposita dinero |
| POST | /api/cuentas/{id}/retiros | Retira dinero (422 si no alcanza el saldo) |
| DELETE | /api/cuentas/{id} | Elimina una cuenta |
La colección de Postman
La colección tests/postman/banco-api.postman\_collection.json tiene 12 peticiones que recorren el ciclo de vida completo de una cuenta: se crea, se deposita, se retira, se elimina y se comprueba que ya no existe. Prueba tanto el camino feliz como los errores:
| Caso | Resultado esperado |
|---|---|
| Obtener una cuenta existente | 200, datos correctos y esquema JSON válido |
| Cuenta que no existe | 404 con mensaje de error |
| Crear cuenta | 201 y cabecera Location |
| Crear cuenta sin titular | 400 (validación) |
| Depositar un monto negativo | 400 |
| Retirar más que el saldo | 422 "Saldo insuficiente" |
| Eliminar y volver a consultar | 204 y luego 404 |
Cada petición tiene sus pruebas en JavaScript. Por ejemplo, al crear una cuenta se valida la respuesta y se guarda el id en una variable para usarlo en las siguientes peticiones:
pm.test('Status 201 Created', () => pm.response.to.have.status(201)); pm.test('Devuelve la cabecera Location', () => pm.response.to.have.header('Location')); const c = pm.response.json(); pm.test('Cuenta creada con los datos enviados', () => { pm.expect(c.titular).to.eql('Maria Quispe'); pm.expect(c.saldo).to.eql(100); }); pm.collectionVariables.set('cuentaId', c.id); También se valida el esquema JSON de la respuesta, para detectar si alguien cambia el contrato de la API:
pm.test('Cumple el esquema', () => { const esquema = { type: 'object', required: \['id', 'titular', 'saldo'], properties: { id: { type: 'integer' }, titular: { type: 'string' }, saldo: { type: 'number' } } }; pm.response.to.have.jsonSchema(esquema); }); Automatización con GitHub Actions
El workflow .github/workflows/pruebas-api.yml se ejecuta en cada push o pull request a main. El job de Newman levanta la API dentro del runner, espera a que responda y ejecuta la colección:
- name: Iniciar la API run: | dotnet run --project src/BancoApi -c Release --urls http://localhost:5000 > api.log 2>\&1 \& for i in $(seq 1 60); do if curl -sf http://localhost:5000/health > /dev/null; then echo "API lista"; exit 0; fi sleep 2 done cat api.log; exit 1 - name: Instalar Newman run: npm install -g newman newman-reporter-htmlextra - name: Ejecutar la colección de Postman run: | mkdir -p site/newman newman run tests/postman/banco-api.postman\_collection.json \\ -e tests/postman/local.postman\_environment.json \\ --reporters cli,htmlextra,junit \\ --reporter-htmlextra-export site/newman/index.html Si alguna prueba falla, Newman termina con error y el pipeline se pone en rojo, así nadie publica una API rota sin darse cuenta. Al final, un último job publica el reporte HTML en GitHub Pages.
Resultados y publicación en la nube
Reporte publicado: viccarretero.github.io/banco-api-pruebas/newman
En la primera ejecución:
| Métrica | Valor |
|---|---|
| Peticiones | 12 |
| Validaciones (assertions) | 24 |
| Pruebas fallidas | 0 |
| Tiempo promedio de respuesta | 8 ms |
| Duración total de la colección | 317 ms |
El reporte de htmlextra muestra cada petición con su respuesta, sus pruebas en verde o rojo y los tiempos, así que cualquier persona del equipo puede revisar el resultado sin instalar nada.
Conclusiones
Newman convierte una colección de Postman en una suite de pruebas automática: las mismas peticiones que usamos para explorar la API se vuelven un control de calidad que corre en cada cambio. Las pruebas funcionales confirman que la API hace lo correcto; para saber si aguanta muchos usuarios a la vez hace falta una prueba de carga, que es justo lo que cubre k6 en el artículo de Gerald.
Enlaces
- Repositorio: github.com/viccarretero/banco-api-pruebas
- Reportes en GitHub Pages: viccarretero.github.io/banco-api-pruebas
- Ejecución del pipeline: GitHub Actions
- Video: https://youtu.be/blr4M__giUk
- Artículo complementario sobre k6 (Gerald Deybi Zevallos Pinto): https://dev.to/gerald_deybizevallospin/pruebas-de-carga-de-una-api-net-con-k6-y-github-actions-hpf
- Newman en GitHub
Victor Carretero — Calidad y Pruebas de Software, Universidad Privada de Tacna.

