TL;DR
- API testing: Testear interfaces de aplicación directamente, sin UI
- Por qué importa: Más rápido, detecta bugs más temprano, testea lógica de negocio directamente
- Tipos: Funcional, performance, security, contract testing
- Herramientas populares: Postman, REST Assured, SuperTest, k6
- Mejor práctica: Testea APIs antes de construir UI
- ROI: Tests API corren 10-100x más rápido que tests UI
Tiempo de lectura: 12 minutos
API testing es esencial para desarrollo de software moderno. Con arquitectura de microservicios y enfoques API-first, testing a nivel API detecta bugs más rápido y confiablemente que testing UI solo.
¿Qué es API Testing?
API testing valida que las interfaces de programación (APIs) funcionan correctamente. En lugar de testear a través de UI, envías requests directamente a endpoints y verificas responses.
Testing UI Tradicional:
Browser → Click botones → Esperar páginas → Verificar UI
API Testing:
HTTP Request → Endpoint → Response → Verificar datos
API testing es más rápido, estable y detecta issues en la capa de lógica de negocio.
Por qué API Testing Importa
1. Testea Más Temprano
APIs están listos antes que UI. Empieza a testear inmediatamente.
Timeline de Desarrollo:
Semana 1: Backend APIs completos ← Empieza API testing
Semana 3: Desarrollo frontend
Semana 5: Testing UI posible
2. Ejecución Más Rápida
Tests API corren significativamente más rápido:
| Tipo Test | Tiempo Ejecución |
|---|---|
| Test UI | 5-30 segundos |
| Test API | 50-500 milisegundos |
| Ventaja | 10-100x más rápido |
3. Más Confiable
Sin inconsistencias de browser, sin issues de rendering UI, sin problemas de timing con animaciones.
4. Mejor Cobertura
Testea edge cases difíciles de alcanzar via UI:
- Responses de error
- Condiciones límite
- Manejo de datos inválidos
Tipos de API Testing
Testing Funcional
Verifica que la API hace lo que debe:
// Test: GET /users retorna lista de usuarios
const response = await fetch('/api/users');
const users = await response.json();
expect(response.status).toBe(200);
expect(users).toBeArray();
expect(users[0]).toHaveProperty('id');
expect(users[0]).toHaveProperty('name');
Testing de Validación
Verifica que validación de datos funciona:
// Test: POST /users rechaza email inválido
const response = await fetch('/api/users', {
method: 'POST',
body: JSON.stringify({ email: 'invalid-email' })
});
expect(response.status).toBe(400);
expect(await response.json()).toHaveProperty('error');
Performance Testing
Verifica que la API maneja carga:
// k6 load test
import http from 'k6/http';
export const options = {
vus: 100, // 100 usuarios virtuales
duration: '30s',
};
export default function () {
http.get('https://api.example.com/users');
}
Security Testing
Verifica autenticación y autorización:
// Test: Endpoint protegido requiere auth
const response = await fetch('/api/admin/users');
expect(response.status).toBe(401);
// Test: Token válido otorga acceso
const authResponse = await fetch('/api/admin/users', {
headers: { 'Authorization': 'Bearer valid-token' }
});
expect(authResponse.status).toBe(200);
Contract Testing
Verifica que API coincide con su especificación:
# Contrato OpenAPI
/users:
get:
responses:
200:
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/User'
Métodos HTTP y Testing
Requests GET
// Obtener datos
const response = await fetch('/api/users/123');
// Assertions
expect(response.status).toBe(200);
expect(response.headers.get('content-type')).toContain('application/json');
Requests POST
// Crear datos
const response = await fetch('/api/users', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
name: 'John Doe',
email: 'john@example.com'
})
});
expect(response.status).toBe(201);
expect(await response.json()).toHaveProperty('id');
Requests PUT/PATCH
// Actualizar datos
const response = await fetch('/api/users/123', {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name: 'Jane Doe' })
});
expect(response.status).toBe(200);
Requests DELETE
// Eliminar datos
const response = await fetch('/api/users/123', {
method: 'DELETE'
});
expect(response.status).toBe(204);
Qué Testear
Códigos de Status
| Código | Significado | Escenario |
|---|---|---|
| 200 | OK | GET/PUT exitoso |
| 201 | Created | POST exitoso |
| 204 | No Content | DELETE exitoso |
| 400 | Bad Request | Input inválido |
| 401 | Unauthorized | Auth faltante/inválido |
| 403 | Forbidden | Permisos insuficientes |
| 404 | Not Found | Recurso no existe |
| 500 | Server Error | Fallas internas |
Headers de Response
expect(response.headers.get('content-type')).toBe('application/json');
expect(response.headers.get('cache-control')).toBeDefined();
Body de Response
const data = await response.json();
// Estructura
expect(data).toHaveProperty('id');
expect(data).toHaveProperty('createdAt');
// Tipos de datos
expect(typeof data.id).toBe('number');
expect(typeof data.name).toBe('string');
// Valores
expect(data.status).toBe('active');
Tiempo de Response
const start = Date.now();
await fetch('/api/users');
const duration = Date.now() - start;
expect(duration).toBeLessThan(500); // Menos de 500ms
Herramientas de API Testing
Testing Manual
Postman
- Cliente API basado en GUI
- Organización de colecciones
- Variables de environment
- Scripts pre-request
Insomnia
- Interfaz limpia
- Soporte GraphQL
- Sistema de plugins
Testing Automatizado
REST Assured (Java)
given()
.contentType("application/json")
.body(user)
.when()
.post("/api/users")
.then()
.statusCode(201)
.body("id", notNullValue());
SuperTest (JavaScript)
const request = require('supertest');
const app = require('./app');
describe('Users API', () => {
it('creates user', async () => {
const response = await request(app)
.post('/api/users')
.send({ name: 'John' })
.expect(201);
expect(response.body.id).toBeDefined();
});
});
Pytest + Requests (Python)
import requests
def test_create_user():
response = requests.post(
'http://api.example.com/users',
json={'name': 'John'}
)
assert response.status_code == 201
assert 'id' in response.json()
Mejores Prácticas
1. Independencia de Tests
Cada test debe ser independiente:
// Bueno: Test auto-contenido
it('deletes user', async () => {
// Crear datos de test
const user = await createUser({ name: 'Test' });
// Test delete
await request(app)
.delete(`/api/users/${user.id}`)
.expect(204);
// Verificar eliminación
await request(app)
.get(`/api/users/${user.id}`)
.expect(404);
});
2. Usa Test Data Factories
const createTestUser = (overrides = {}) => ({
name: 'Test User',
email: `test-${Date.now()}@example.com`,
...overrides
});
3. Testea Escenarios de Error
describe('Error handling', () => {
it('returns 404 for non-existent user', async () => {
await request(app)
.get('/api/users/99999')
.expect(404);
});
it('returns 400 for invalid input', async () => {
await request(app)
.post('/api/users')
.send({ email: 'invalid' })
.expect(400);
});
});
FAQ
¿Qué es API testing?
API testing valida que las interfaces de programación funcionan correctamente. En lugar de testear a través de UI, envías HTTP requests directamente a endpoints y verificas los responses. Esto testea funcionalidad, validación de datos, manejo de errores, performance y seguridad a nivel API, independiente de cualquier frontend.
¿Por qué es importante API testing?
API testing detecta bugs más temprano en desarrollo (APIs están listos antes de UI), corre 10-100x más rápido que tests UI, provee resultados más confiables (sin inconsistencias de browser) y ofrece mejor cobertura de lógica de negocio. Con arquitectura de microservicios, API testing es esencial para validar interacciones de servicios.
¿Qué herramientas se usan para API testing?
Para testing manual: Postman, Insomnia. Para automatización: REST Assured (Java), SuperTest (JavaScript), Pytest con Requests (Python). Para performance: k6, JMeter, Gatling. Para contract testing: Pact, Dredd. Elige basándote en tu tech stack y necesidades de testing.
¿Cuál es la diferencia entre API testing y unit testing?
Unit testing testea funciones/métodos individuales en aislamiento, frecuentemente con dependencias mockeadas. API testing testea endpoints completos, incluyendo routing, middleware, validación, interacciones con base de datos y formateo de response. Unit tests son más pequeños y rápidos; API tests validan el ciclo completo request-response.
Ver También
- API Testing Tutorial - API testing práctico
- Postman Tutorial - Guía completa de Postman
- REST API Testing - Estrategias testing REST
- Postman vs Insomnia - Comparación de herramientas
