Catch2 / Google Test para C++: guía completa con ejemplos

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: ¿Qué son Catch2 y Google Test y para qué sirven?

\n\n

En el desarrollo moderno de software en C++, las pruebas no son un lujo, sino una necesidad. Las bibliotecas de pruebas unitarias (unit testing) permiten a los desarrolladores verificar automáticamente que los componentes individuales del programa (funciones, clases, módulos) funcionen correctamente. Las dos bibliotecas más populares para este propósito son Catch2 y Google Test (gtest).

\n\n

Catch2 es una biblioteca moderna, ligera y muy conveniente para pruebas unitarias. Su característica principal es el uso de macros que hacen que las pruebas sean legibles y se asemejen al inglés común. Catch2 admite el estilo Behaviour-Driven Development (BDD), el registro automático de pruebas y no requiere una configuración compleja.

\n\n

Google Test (gtest) es una biblioteca potente y madura de Google, que es el estándar de facto en muchos proyectos grandes. Ofrece un rico conjunto de macros de aserción (assertion), mecanismos para crear fixtures de prueba (test fixtures), pruebas parametrizadas y una excelente integración con el sistema de compilación CMake.

\n\n

Ambas bibliotecas resuelven la misma tarea: permiten escribir pruebas que se ejecutan automáticamente e informan los resultados. La elección entre ellas a menudo depende de las preferencias personales, los requisitos del proyecto o la infraestructura existente. En este artículo, analizaremos ambas bibliotecas, ya que son muy similares en concepto, pero tienen diferencias en sintaxis y API.

\n\n

Instalación

\n\n

A diferencia de Python (donde se usa pip), la instalación de bibliotecas para C++ generalmente se realiza a través de gestores de paquetes del sistema o mediante la integración con el sistema de compilación (por ejemplo, CMake). Consideremos ambas opciones.

\n\n

Instalación de Catch2

\n

Método 1: A través de vcpkg (recomendado)

\n
# Instale vcpkg si aún no está instalado\ngit clone https://github.com/Microsoft/vcpkg.git\ncd vcpkg\n./bootstrap-vcpkg.sh  # o .\\bootstrap-vcpkg.bat en Windows\n\n# Instale Catch2\n./vcpkg install catch2\n\n# Integración con CMake\n./vcpkg integrate install
\n\n

Método 2: Header-only (el más simple)
\nCatch2 se puede usar como una biblioteca header-only. Simplemente descargue el archivo catch.hpp del repositorio oficial y colóquelo en la carpeta de su proyecto. Luego, inclúyalo en el código:

\n
#define CATCH_CONFIG_MAIN  // Esta línea debe estar solo en un archivo .cpp\n#include "catch.hpp"
\n\n

Instalación de Google Test

\n

Método 1: A través de vcpkg

\n
./vcpkg install gtest\n./vcpkg integrate install
\n\n

Método 2: A través de CMake FetchContent (recomendado para proyectos con CMake)
\nAgregue a su CMakeLists.txt:

\n
include(FetchContent)\nFetchContent_Declare(\n  googletest\n  GIT_REPOSITORY https://github.com/google/googletest.git\n  GIT_TAG release-1.12.1\n)\nFetchContent_MakeAvailable(googletest)\n\n# Ahora puede usar target_link_libraries para su archivo de prueba\nadd_executable(my_tests test.cpp)\ntarget_link_libraries(my_tests GTest::gtest_main)
\n\n

Inicio rápido con un ejemplo de código

\n\n

Escribamos una función simple y probémosla con ambas bibliotecas. La función calculará el factorial de un número.

\n\n

Ejemplo con Catch2

\n
#define CATCH_CONFIG_MAIN\n#include "catch.hpp"\n\n// Función a probar\nunsigned int factorial(unsigned int n) {\n    if (n == 0) return 1;\n    return n * factorial(n - 1);\n}\n\n// Caso de prueba\nTEST_CASE("Los factoriales se calculan correctamente", "[factorial]") {\n    REQUIRE(factorial(0) == 1);\n    REQUIRE(factorial(1) == 1);\n    REQUIRE(factorial(2) == 2);\n    REQUIRE(factorial(3) == 6);\n    REQUIRE(factorial(10) == 3628800);\n}\n\n// Otro caso de prueba con secciones\nTEST_CASE("Verificación de casos límite", "[factorial][edge]") {\n    SECTIO                    

Recommendations