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 TestTiempo Ejecución
Test UI5-30 segundos
Test API50-500 milisegundos
Ventaja10-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ódigoSignificadoEscenario
200OKGET/PUT exitoso
201CreatedPOST exitoso
204No ContentDELETE exitoso
400Bad RequestInput inválido
401UnauthorizedAuth faltante/inválido
403ForbiddenPermisos insuficientes
404Not FoundRecurso no existe
500Server ErrorFallas 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