Matchers de Catch2 en C++: guía completa con ejemplos
1. ¿Qué son y para qué sirven?
La librería Catch2 (C++ Automated Test Cases in Headers) es un framework moderno para pruebas unitarias en C++ que se distribuye como un único archivo de cabecera. Una de sus características más potentes es el sistema de Matchers: herramientas declarativas para verificar valores que hacen que los tests sean más legibles, flexibles e informativos.
A diferencia de las aserciones tradicionales como REQUIRE(x == 5), los matchers permiten formular condiciones complejas de una forma natural, casi legible para humanos. Por ejemplo, en lugar de escribir un bucle para verificar todos los elementos de un vector, puedes usar REQUIRE_THAT(vec, Catch::Matchers::AllMatch(Catch::Matchers::Predicate<int>([](int i) { return i > 0; }))). Esto no solo reduce el código, sino que hace que las intenciones del desarrollador sean absolutamente claras.
¿Para qué sirven los matchers? Primero, ofrecen alta expresividad: puedes verificar que un string contiene una subcadena, comienza con un prefijo específico, o que un número está dentro de un rango, usando una sola construcción concisa. Segundo, proporcionan diagnósticos detallados cuando un test falla — en lugar de un seco "false", obtienes un mensaje significativo como: "Expected: starts with 'Hello' Actual: 'World'". Tercero, son componibles: puedes combinar matchers simples en expresiones complejas usando operadores lógicos (And, Or, Not).
2. Instalación
Catch2 es una librería header-only. No requiere una instalación compleja ni configuración de compilación. Hay dos formas principales de usarla:
Forma 1: Descargar un solo archivo (recomendado para empezar)
Descarga el archivo catch_amalgamated.hpp o catch.hpp desde la página oficial de versiones de Catch2 en GitHub. Colócalo en la carpeta de tu proyecto e inclúyelo en tu código:
#include "catch_amalgamated.hpp"
Forma 2: Usar un gestor de dependencias (vcpkg, Conan, CMake FetchContent)
Para proyectos profesionales, se recomienda usar un gestor de paquetes. Ejemplo con vcpkg:
# Instala Catch2 a través de vcpkg
vcpkg install catch2
Luego, en tu CMakeLists.txt:
find_package(Catch2 REQUIRED)
target_link_libraries(my_test PRIVATE Catch2::Catch2WithMain)
Importante: En las versiones de Catch2 v3.x y superiores, los matchers están en el espacio de nombres Catch::Matchers. En la versión v2.x también estaban en Catch::Matchers (lo mismo, pero la estructura de archivos de cabecera cambió). Para v3.x usa #include <catch2/catch_test_macros.hpp> y #include <catch2/matchers/catch_matchers_all.hpp>.
3. Inicio rápido — ejemplo mínimo funcional
Escribamos un test sencillo usando un matcher para verificar un string:
// test.cpp
#define CATCH_CONFIG_MAIN // Esta línea debe estar solo en un archivo .cpp
#include <catch2/catch_test_macros.hpp>
#include <catch2/matchers/catch_matchers_all.hpp>
#include <string>
TEST_CASE("Los matchers de strings funcionan", "[string]") {
std::string hello = "¡Hola, Mundo!";
// Verifica que el string contiene una subcadena
CHECK_THAT(hello, Catch::Matchers::ContainsSubstring("Mundo"));
// Verifica que el string comienza con "¡Hola"
CHECK_THAT(hello, Catch::Matchers::StartsWith("¡Hola"));
// Verifica que el string termina con "!"
CHECK_THAT(hello, Catch::Matchers::EndsWith("!"));
}
También en la biblioteca
Markdig para C# (.NET): guía completa con ejemplos prácticos
Planificador de tareas Kotlin: kotlinx-coroutines-core y la biblioteca korGE
Configuración de aplicaciones en Go: biblioteca viper
Trabajo con YAML en TypeScript: análisis, generación y validación de datos
Trabajo con CSV en Rust: bibliotecas csv, serde y procesamiento eficiente de datos