Entendiendo CRUD
CRUD significa Create, Read, Update, Delete — las cuatro operaciones basicas para almacenamiento persistente de datos. Casi cada endpoint de API mapea a una de estas operaciones:
| CRUD | Metodo HTTP | Ejemplo | Status Tipico |
|---|---|---|---|
| Create | POST | POST /users | 201 Created |
| Read | GET | GET /users/42 | 200 OK |
| Update | PUT / PATCH | PUT /users/42 | 200 OK |
| Delete | DELETE | DELETE /users/42 | 204 No Content |
Testear operaciones CRUD sistematicamente asegura que la API maneje correctamente todo el ciclo de vida de un recurso — desde la creacion hasta la eliminacion.
Testing de Create (POST)
Tests del Happy Path
POST /api/users
Content-Type: application/json
{
"name": "Alice Johnson",
"email": "alice@example.com",
"role": "developer"
}
Verificar:
- El status de respuesta es 201 Created
- El body de respuesta contiene el recurso creado con un
idgenerado - Todos los campos enviados estan presentes en la respuesta
- Los campos generados por el servidor existen (
id,createdAt,updatedAt) - El header Location apunta a la URL del nuevo recurso
- Obtener el recurso via GET retorna los mismos datos
Tests de Validacion
| Escenario | Esperado |
|---|---|
| Campo requerido faltante (name) | 400 con mensaje de error claro |
Campo requerido vacio ("") | 400 con error de validacion |
| Formato de email invalido | 400/422 con error de formato |
| String donde se espera numero | 400 con error de tipo |
| Valor excediendo longitud maxima | 400 con error de longitud |
| Campos desconocidos extra | Ignorados o 400 (depende del diseno) |
Tests de Unicidad
| Escenario | Esperado |
|---|---|
| Email duplicado | 409 Conflict |
| Nombre duplicado (si es unico) | 409 Conflict |
Sensibilidad a mayusculas (alice@test.com vs Alice@test.com) | Depende del diseno |
Tests de Limite
- Longitudes maximas de campos (255 chars para nombre, etc.)
- Caracteres especiales: Unicode, emojis, tags HTML, strings de SQL injection
- Valores minimos: arrays vacios, cantidades cero
- Tamano maximo de payload
Testing de Read (GET)
Recurso Individual
GET /api/users/42
Verificar:
- Retorna 200 OK con datos completos del usuario
- Todos los campos esperados estan presentes
- Los tipos de datos son correctos (numero para id, string para nombre)
- Campos sensibles estan excluidos (password, IDs internos)
Coleccion (Lista)
GET /api/users?page=1&limit=20&sort=name&order=asc
Verificar:
- Retorna array de recursos
- Metadata de paginacion presente (total, page, limit, pages)
- El ordenamiento funciona correctamente
- El filtrado retorna solo recursos que coinciden
- La paginacion por defecto aplica cuando no se envian parametros
Casos Borde
| Escenario | Esperado |
|---|---|
ID inexistente (GET /users/99999) | 404 Not Found |
Formato de ID invalido (GET /users/abc) | 400 o 404 |
ID negativo (GET /users/-1) | 400 o 404 |
Pagina mas alla de resultados (?page=9999) | 200 con array vacio |
Limit muy grande (?limit=100000) | Limitado al maximo o 400 |
Testing de Update (PUT / PATCH)
PUT — Reemplazo Completo
PUT /api/users/42
Content-Type: application/json
{
"name": "Alice Smith",
"email": "alice.smith@example.com",
"role": "senior-developer"
}
Verificar:
- Todos los campos se reemplazan con nuevos valores
- Campos opcionales omitidos se resetean a valores por defecto o se eliminan
- El timestamp
updatedAtcambia idycreatedAtpermanecen sin cambios- GET despues de PUT retorna los datos actualizados
PATCH — Actualizacion Parcial
PATCH /api/users/42
Content-Type: application/json
{
"role": "senior-developer"
}
Verificar:
- Solo cambia el campo especificado
- Todos los demas campos permanecen exactamente como antes
- El timestamp
updatedAtcambia
Casos Borde de Actualizacion
| Escenario | Esperado |
|---|---|
| Actualizar recurso inexistente | 404 Not Found |
| Actualizar con datos invalidos | 400 con error de validacion |
| Actualizar campos de solo lectura (id, createdAt) | 400 o campos ignorados |
| Actualizaciones concurrentes (dos PUTs simultaneos) | Ultima escritura gana o 409 |
| Actualizar a valor unico duplicado | 409 Conflict |
Testing de Delete (DELETE)
Delete Estandar
DELETE /api/users/42
Verificar:
- Retorna 204 No Content (o 200 OK con confirmacion)
- GET del recurso eliminado retorna 404
- El recurso ya no aparece en el endpoint de lista
- Los recursos relacionados se manejan correctamente (cascada o proteccion de huerfanos)
Casos Borde de Delete
| Escenario | Esperado |
|---|---|
| Eliminar recurso inexistente | 404 Not Found |
| Eliminar recurso ya eliminado | 404 Not Found |
| Eliminar recurso con dependencias | 409 o eliminacion en cascada |
| Eliminar sin autorizacion | 401/403 |
Test de Flujo CRUD End-to-End
El test mas importante es el ciclo de vida completo:
1. POST /users → Crear usuario → Guardar ID
2. GET /users/{id} → Verificar que el usuario existe con datos correctos
3. GET /users → Verificar que el usuario aparece en la lista
4. PUT /users/{id} → Actualizar todos los campos
5. GET /users/{id} → Verificar actualizacion aplicada
6. PATCH /users/{id} → Actualizar parcialmente un campo
7. GET /users/{id} → Verificar que solo ese campo cambio
8. DELETE /users/{id} → Eliminar usuario
9. GET /users/{id} → Verificar 404
10. GET /users → Verificar que el usuario ya no esta en la lista
Este flujo testea persistencia, consistencia y limpieza de datos a lo largo de todo el ciclo de vida.
Relaciones de Datos
Cuando los recursos tienen relaciones (usuario tiene muchos pedidos), testea:
- Crear recurso hijo con ID de padre valido
- Crear recurso hijo con ID de padre invalido (deberia fallar)
- Eliminar padre con hijos existentes (comportamiento en cascada)
- Obtener padre incluye/excluye hijos segun lo documentado
- Actualizar padre no afecta datos del hijo
Ejercicio Practico
Usando JSONPlaceholder (https://jsonplaceholder.typicode.com):
- Ciclo CRUD completo: Crea un post, leelo, actualizalo con PUT, actualizacion parcial con PATCH, eliminalo, verifica la eliminacion
- Testing de validacion: Intenta crear un post con campos faltantes, tipos incorrectos, valores vacios
- Testing de relaciones: Crea un post, luego crea comentarios para ese post. Que pasa cuando eliminas el post?
- Testing de lista: Testea paginacion, filtrado por userId y verifica la estructura de respuesta para GET /posts
Puntos Clave
- Las operaciones CRUD forman la columna vertebral del testing de API — cada recurso pasa por crear, leer, actualizar, eliminar
- Siempre verifica la persistencia de datos siguiendo POST con GET para confirmar que el recurso realmente existe
- Testea tanto PUT (reemplazo completo) como PATCH (actualizacion parcial) para asegurar que se comportan diferente como se espera
- Los tests de flujo CRUD end-to-end detectan bugs de integracion que tests de operaciones individuales pueden perder
- No olvides los casos borde: recursos inexistentes, entradas duplicadas, eliminaciones en cascada y actualizaciones concurrentes