Pruebas en C++: unit, integration, e2e de la A a la Z — guía completa

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: Por qué las pruebas en C++ son la base de un código fiable

\n

Desarrollar en C++ siempre implica trabajar con una alta responsabilidad. El lenguaje proporciona control total sobre la memoria y el rendimiento, pero el precio de un error puede ser catastrófico: desde fugas de memoria hasta el colapso de todo el sistema. Por eso, las pruebas en C++ no son una opción, sino una etapa obligatoria en el desarrollo de cualquier proyecto serio.

\n

En este artículo, analizaremos tres niveles clave de pruebas: unit (unitarias), integration (de integración) y e2e (de extremo a extremo). Aprenderás en qué se diferencian, qué herramientas usar y cómo escribir pruebas en C++ correctamente. El material será útil tanto para principiantes como para desarrolladores experimentados que deseen sistematizar sus conocimientos.

\n\n

1. Pruebas unitarias en C++: Probando los «ladrillos» del programa

\n

Las pruebas unitarias verifican la unidad de código más pequeña, generalmente una función individual o un método de clase. Su objetivo principal es aislar el componente y asegurarse de que funcione correctamente sin dependencias externas.

\n\n

1.1. Herramientas para pruebas unitarias en C++

\n

En el mercado de C++ existen varios frameworks maduros. Estos son los más populares:

\n
    \n
  • Google Test (GTest) — el estándar de facto. Potentes macros, soporte para pruebas parametrizadas, objetos mock (a través de Google Mock).
  • \n
  • Catch2 — ligero, moderno, con una sintaxis excelente. Adecuado para proyectos pequeños.
  • \n
  • Boost.Test — parte de la biblioteca Boost. Voluminoso, pero funcional.
  • \n
\n

Usaremos Google Test por ser la opción más común.

\n\n

1.2. Ejemplo de prueba unitaria en C++ (Google Test)

\n

Supongamos que tenemos una función simple para calcular el factorial:

\n
// math_utils.h\n#pragma once\nint factorial(int n);
\n
// math_utils.cpp\n#include "math_utils.h"\nint factorial(int n) {\n    if (n < 0) return -1; // error: número negativo\n    if (n == 0) return 1;\n    return n * factorial(n - 1);\n}
\n

Ahora escribamos una prueba unitaria con Google Test:

\n
// test_math_utils.cpp\n#include <gtest/gtest.h>\n#include "math_utils.h"\n\nTEST(FactorialTest, HandlesZeroInput) {\n    EXPECT_EQ(factorial(0), 1);\n}\n\nTEST(FactorialTest, HandlesPositiveInput) {\n    EXPECT_EQ(factorial(5), 120);\n}\n\nTEST(FactorialTest, HandlesNegativeInput) {\n    EXPECT_EQ(factorial(-1), -1);\n}\n\nint main(int argc, char **argv) {\n    ::testing::InitGoogleTest(&argc, argv);\n    return RUN_ALL_TESTS();\n}
\n

Ejecutamos las pruebas y vemos luz verde. Si hubiera un error en la función (por ejemplo, factorial(5) devolviera 119), la prueba fallaría y nos enteraríamos del problema de inmediato.

\n\n

1.3. Mejores prácticas para pruebas unitarias

\n
    \n
  • Aislamiento: Usa mocks para reemplazar dependencias externas (BD, red, sistema de archivos).
  • \n
  • Una verificación por prueba: Cada TEST debe verificar un solo comportamiento.
  • \n
  • Nombres claros: HandlesZeroInput es mejor que Test1.
  • \n
  • Cobertura de casos límite: Cero, números negativos, máximos.
  • \n
\n\n

2. Pruebas de integración (Integration Testing): Verificando la interacción

\n

Las pruebas de integración verifican cómo funcionan juntos los diferentes módulos del sistema. A diferencia de las pruebas unitarias, aquí no aislamos los componentes; verificamos las conexiones reales (por ejemplo, la llamada a una función de una clase que utiliza otra clase).

\n\n

2.1. ¿Cuándo se necesitan las pruebas de integración?

\n