Pruebas Unitarias vs Pruebas de Integración vs Pruebas de Sistema: ¿Cuál es la Diferencia?

Ashley Goolam

Ashley Goolam

23 December 2025

Pruebas Unitarias vs Pruebas de Integración vs Pruebas de Sistema: ¿Cuál es la Diferencia?

La cuestión de las pruebas unitarias vs pruebas de integración vs pruebas de sistema a veces confunde incluso a desarrolladores experimentados. Estos tres niveles de prueba forman la base de la calidad del software, sin embargo, los equipos a menudo los utilizan incorrectamente, creando conjuntos de pruebas que son demasiado superficiales o imposiblemente caros de mantener. Comprender dónde encaja cada uno en su estrategia de pruebas no es académico, sino que impacta directamente en la rapidez con la que puede entregar y la confianza que puede tener en sus lanzamientos.

Esta guía aclarará el alcance, el propósito y el momento de cada nivel de prueba, mostrándole cómo funcionan juntos en la pirámide de pruebas, y también proporcionará ejemplos prácticos que puede aplicar de inmediato. Mientras desarrolla microservicios, monolitos o APIs, es esencial comprender las pruebas unitarias vs las pruebas de integración vs las pruebas de sistema.

button

¿Qué son las pruebas unitarias?

Las pruebas unitarias validan las partes más pequeñas y probables de su aplicación —funciones individuales, métodos o clases— en completo aislamiento. El objetivo es demostrar que cada unidad se comporta correctamente según su especificación.

Alcance y ejemplo

Una prueba unitaria examina una pieza de lógica sin dependencias. Aquí tiene un ejemplo simple:

// Función bajo prueba
function calculateDiscount(price, discountPercent) {
  if (discountPercent < 0 || discountPercent > 100) {
    throw new Error('Invalid discount percentage');
  }
  return price * (discountPercent / 100);
}

// Unit test
describe('calculateDiscount', () => {
  it('calculates 20% discount correctly', () => {
    expect(calculateDiscount(100, 20)).toBe(20);
  });
  
  it('throws error for negative discount', () => {
    expect(() => calculateDiscount(100, -5)).toThrow();
  });
});

Observe que la prueba proporciona entradas y verifica las salidas directamente, sin involucrar bases de datos, APIs o UI.

Pros y Contras

Pros:

Contras:

¿Qué son las pruebas de integración?

Las pruebas de integración verifican que múltiples componentes funcionen correctamente juntos. Se centran en las interfaces entre unidades: puntos finales de API, conexiones a bases de datos, colas de mensajes e interacciones de servicios.

Alcance y ejemplo

Aquí hay una prueba de integración para un punto final de registro de usuario que accede a la base de datos:

// Integration test for POST /api/users
describe('User Registration API', () => {
  it('creates user and stores in database', async () => {
    const userData = {
      name: 'Test User',
      email: 'test@example.com',
      password: 'ValidPass123'
    };
    
    // Act: Call the actual API
    const response = await axios.post('http://localhost:3000/api/users', userData);
    
    // Assert: Check response AND database
    expect(response.status).toBe(201);
    expect(response.data).toHaveProperty('userId');
    
    // Verify database state
    const userInDb = await db.users.findByEmail('test@example.com');
    expect(userInDb).toBeTruthy();
    expect(userInDb.name).toBe('Test User');
  });
});

Esta prueba demuestra que la API, la lógica de negocio y la integración de la base de datos funcionan juntas.

Pros y Contras

Pros:

Contras:

¿Qué son las pruebas de sistema?

Las pruebas de sistema validan el sistema completo e integrado contra los requisitos de negocio. Tratan la aplicación como una caja negra, probando flujos de trabajo de extremo a extremo desde la perspectiva del usuario.

Alcance y ejemplo

Una prueba de sistema para un flujo de trabajo de compra de comercio electrónico:

// System test: Complete purchase flow
describe('E-commerce Purchase System', () => {
  it('allows user to browse, add to cart, and checkout', async () => {
    // Step 1: User registration
    const user = await api.register('shopper@example.com', 'password');
    
    // Step 2: Browse products
    const products = await api.searchProducts('laptop');
    expect(products.length).toBeGreaterThan(0);
    
    // Step 3: Add to cart
    await api.addToCart(user.token, products[0].id, 1);
    
    // Step 4: Checkout
    const order = await api.checkout(user.token, {
      shippingAddress: '123 Main St',
      paymentMethod: 'visa'
    });
    
    // Oracle: Verify complete order
    expect(order.status).toBe('confirmed');
    expect(order.total).toBeGreaterThan(0);
    
    // Verify side effects
    const inventory = await api.getInventory(products[0].id);
    expect(inventory.stock).toBe(initialStock - 1);
  });
});

Esto abarca múltiples APIs, bases de datos y servicios externos (pasarela de pago).

Pros y Contras

Pros:

Contras:

La pirámide de pruebas de software: relación entre las tres

La pirámide de pruebas visualiza cómo se deben distribuir las pruebas unitarias vs pruebas de integración vs pruebas de sistema:

        Pruebas de Sistema (10%)
            ▲
    Pruebas de Integración (30%)
            ▲
    Pruebas Unitarias (60%)

Capa inferior (Pruebas unitarias): Mayor volumen, ejecución más rápida, se ejecutan constantemente
Capa intermedia (Pruebas de integración): Volumen moderado, validan integraciones críticas
Capa superior (Pruebas de sistema): Menor volumen, prueban los flujos de trabajo de negocio centrales

Esta forma garantiza una retroalimentación rápida manteniendo la confianza. Invierta la pirámide (muchas pruebas de sistema, pocas pruebas unitarias) y su conjunto de pruebas se volverá lento, frágil y costoso.

software testing pyramid

Cuándo realizar cada prueba: integración en el ciclo de vida

Fase de Desarrollo Tipo de Prueba Principal Frecuencia Tiempo de Ejecución
Escritura de código Pruebas unitarias En cada guardado < 1 segundo
Pull request Unitarias + Integración Pre-commit 1-5 minutos
Pre-merge Integración + Sistema (Seleccionadas) Al aprobar el PR 5-15 minutos
Compilación nocturna Suite completa (todos los tipos) Diaria 30-60 minutos
Pre-lanzamiento Pruebas de sistema + Smoke tests Antes del despliegue 15-30 minutos
Producción Smoke tests + Monitoreo Continuo Tiempo real

Acertar con el momento de las pruebas unitarias vs pruebas de integración vs pruebas de sistema evita cuellos de botella al tiempo que garantiza que las puertas de calidad sean significativas.

Tabla comparativa: Elegir la prueba adecuada

Factor Prueba Unitaria Prueba de Integración Prueba de Sistema
Velocidad ⚡⚡⚡ Muy Rápida ⚡⚡ Moderada ⚡ Lenta
Aislamiento Alto Medio Bajo
Capacidad de Depuración Fácil Moderada Difícil
Confianza Baja Media Alta
Mantenimiento Bajo Medio Alto
Cuándo Escribir Antes/durante la codificación Después de que las unidades funcionen Después de la integración
Quién Escribe Desarrolladores Desarrolladores + QA QA + Desarrolladores

Ejemplo práctico: Prueba de un punto final de API

Veamos las pruebas unitarias vs pruebas de integración vs pruebas de sistema en acción para un punto final POST /api/users:

Prueba Unitaria (Probando la lógica de validación)

// Test only the validation function
describe('validateUser', () => {
  it('rejects invalid email', () => {
    const result = validateUser({ email: 'invalid' });
    expect(result.isValid).toBe(false);
    expect(result.errors).toContain('Invalid email format');
  });
});

Prueba de Integración (Probando API + Base de Datos)

// Test API layer with real database
describe('POST /api/users integration', () => {
  it('creates user in database', async () => {
    const response = await request(app)
      .post('/api/users')
      .send({ name: 'Test', email: 'test@example.com' });
    
    expect(response.status).toBe(201);
    
    // Oracle: Verify database
    const user = await db.users.findByEmail('test@example.com');
    expect(user.name).toBe('Test');
  });
});

Prueba de Sistema (Probando el flujo de trabajo completo)

// Test registration → login → profile update
describe('User management system', () => {
  it('allows complete user lifecycle', async () => {
    // Register
    const reg = await api.post('/api/users', userData);
    expect(reg.status).toBe(201);
    
    // Login
    const login = await api.post('/api/auth/login', credentials);
    expect(login.data.token).toBeTruthy();
    
    // Update profile
    const update = await api.put('/api/users/me', updates, {
      headers: { Authorization: `Bearer ${login.data.token}` }
    });
    expect(update.status).toBe(200);
    
    // Verify final state
    const profile = await api.get('/api/users/me', {
      headers: { Authorization: `Bearer ${login.data.token}` }
    });
    expect(profile.data.name).toBe(updates.name);
  });
});

Cómo Apidog ayuda a los equipos de desarrollo con las pruebas de API

Comprender las pruebas unitarias vs pruebas de integración vs pruebas de sistema es crucial, pero implementarlas para APIs puede ser tedioso. Apidog automatiza el trabajo pesado, especialmente para las pruebas de integración y de sistema.

Generación automática de oráculos de prueba

Para las pruebas de integración, Apidog crea oráculos de prueba directamente desde su especificación OpenAPI:

# A partir de su especificación de API, Apidog genera:
Prueba: POST /api/users
Oráculo 1: El estado debe ser 201
Oráculo 2: La respuesta debe coincidir con el esquema de Usuario
Oráculo 3: El encabezado Location debe existir
Oráculo 4: Tiempo de respuesta < 500ms
Oráculo 5: La consulta a la base de datos devuelve el usuario creado

Esto elimina la definición manual de oráculos y mantiene las pruebas sincronizadas con su contrato de API.

Constructor visual de pruebas para pruebas de sistema

Probar flujos de trabajo complejos del sistema se vuelve visual en Apidog:

Prueba: Incorporación completa del usuario
1. POST /api/users (crear)
2. POST /api/auth/verify (verificación de email)
3. POST /api/auth/login (autenticar)
4. GET /api/dashboard (cargar datos)
5. POST /api/preferences (establecer preferencias)

Aserciones en cada paso + validación del estado final

Usted construye esto arrastrando y soltando llamadas a la API, con Apidog manejando automáticamente la autenticación, el encadenamiento de datos y las aserciones.

button
testing in apidog

Integración CI/CD para pruebas continuas

Apidog ejecuta su jerarquía de pruebas unitarias vs pruebas de integración vs pruebas de sistema en CI/CD:

# Pipeline de GitHub Actions
- name: Ejecutar Pruebas Unitarias
  run: npm test:unit

- name: Ejecutar Pruebas de Integración de Apidog
  run: apidog run --tags "@integration"

- name: Ejecutar Pruebas de Sistema de Apidog
  run: apidog run --tags "@system"

Esto asegura que cada tipo de prueba se ejecute en la etapa apropiada con los resultados publicados directamente en Slack o por correo electrónico.

ci/cd in apidog

Visibilidad de la cobertura de pruebas

Apidog muestra qué APIs tienen cobertura de pruebas unitarias, de integración y de sistema:

Punto Final Unitaria Integración Sistema Cobertura
POST /users 100%
GET /users/:id 67%
DELETE /users 67%

Esta visibilidad ayuda a los equipos a cubrir las lagunas de pruebas estratégicamente.

Preguntas frecuentes

P1: ¿Debo escribir pruebas unitarias para los puntos finales de la API?

R: Los puntos finales de la API orquestan la lógica, por lo que deben tener pruebas de integración. La lógica de negocio dentro de los puntos finales debe ser probada unitariamente de forma separada.

P2: ¿Cuántas pruebas de integración son suficientes?

R: Cubra todos los caminos críticos y escenarios de error. Una buena regla: si un error en la integración llegaría a producción, escriba una prueba para ello.

P3: ¿Vale la pena el coste de mantenimiento de las pruebas de sistema?

R: Sí, pero solo para los flujos de trabajo de negocio centrales. Limite las pruebas de sistema al 10-20% de las características que generan el 80% del valor de negocio.

P4: ¿Puede Apidog generar pruebas unitarias?

R: No. Las pruebas unitarias requieren conocimiento de la estructura interna del código. Apidog sobresale en las pruebas de integración y de sistema donde puede observar el comportamiento de la API desde el exterior.

P5: ¿Qué tipo de prueba debo priorizar para un nuevo proyecto?

R: Comience con pruebas unitarias (base), añada pruebas de integración a medida que los componentes se conecten, luego añada pruebas de sistema para los viajes críticos del usuario. Este enfoque de pirámide previene la deuda técnica.

Conclusión

La decisión sobre pruebas unitarias vs pruebas de integración vs pruebas de sistema no se trata de elegir una sobre otra, sino de aplicar cada una en el momento y la proporción correctos. Las pruebas unitarias le brindan velocidad y precisión para el desarrollo. Las pruebas de integración detectan problemas de conexión que las unidades no ven. Las pruebas de sistema brindan la confianza de que el producto completo funciona para los usuarios.

Domine esta jerarquía y su conjunto de pruebas se convertirá en un activo estratégico en lugar de una carga de mantenimiento. Comience auditando su distribución actual de pruebas. ¿Está invertida con demasiadas pruebas de sistema lentas y frágiles? Cambie el enfoque hacia abajo. ¿Le falta cobertura de integración crítica? Llene esos huecos.

Herramientas modernas como Apidog hacen que las capas de integración y sistema sean mucho más manejables al automatizar la creación y ejecución de pruebas. Esto le permite mantener la forma de la pirámide de pruebas sin ralentizar la velocidad de desarrollo. La calidad se convierte en un resultado natural de su proceso, no en una fase separada que retrasa los lanzamientos.

Recuerde: el objetivo no es probar todo, sino probar las cosas correctas en el nivel correcto. Cuando las pruebas unitarias vs pruebas de integración vs pruebas de sistema están claras en su estrategia, la entrega se vuelve predecible, la confianza crece y su equipo dedica menos tiempo a apagar incendios y más tiempo a construir valor.

button

Practica el diseño de API en Apidog

Descubre una forma más fácil de construir y usar APIs

Pruebas Unitarias vs Pruebas de Integración vs Pruebas de Sistema: ¿Cuál es la Diferencia?