Matchers do Catch2 para C++: guia completo com exemplos práticos
1. O que são e para que servem
A biblioteca Catch2 (C++ Automated Test Cases in Headers) é um framework moderno para testes unitários em C++, distribuído como um único arquivo de cabeçalho. Uma de suas funcionalidades mais poderosas é o sistema de Matchers — ferramentas declarativas para verificar valores que tornam os testes mais legíveis, flexíveis e informativos.
Diferente das asserções tradicionais no estilo REQUIRE(x == 5), os matchers permitem formular condições de verificação complexas de forma natural, quase legível por humanos. Por exemplo, em vez de escrever um loop para verificar todos os elementos de um vetor, você pode usar REQUIRE_THAT(vec, Catch::Matchers::AllMatch(Catch::Matchers::Predicate<int>([](int i) { return i > 0; }))). Isso não só reduz o código, mas também torna as intenções do testador cristalinamente claras.
Para que servem os matchers? Primeiro, eles oferecem alta expressividade: você pode verificar se uma string contém uma substring, começa com um prefixo específico, ou se um número está dentro de um intervalo, usando uma única construção concisa. Segundo, os matchers fornecem diagnósticos detalhados quando um teste falha — em vez de um seco "false", você recebe uma mensagem significativa, como: "Expected: starts with 'Hello' Actual: 'World'". Terceiro, eles são componíveis: você pode combinar matchers simples em expressões complexas usando operadores lógicos (And, Or, Not).
2. Instalação
Catch2 é uma biblioteca header-only (apenas cabeçalho). Para usá-la, não é necessária uma instalação complicada ou configuração de build. Existem duas maneiras principais:
Método 1: Baixar um único arquivo (recomendado para iniciantes)
Baixe o arquivo catch_amalgamated.hpp ou catch.hpp da página oficial de releases do Catch2 no GitHub. Coloque-o na pasta do seu projeto e inclua no código:
#include "catch_amalgamated.hpp"
Método 2: Usar um gerenciador de dependências (vcpkg, Conan, CMake FetchContent)
Para projetos profissionais, recomenda-se usar um gerenciador de pacotes. Exemplo com vcpkg:
# Instale o Catch2 via vcpkg
vcpkg install catch2
Depois, no seu CMakeLists.txt:
find_package(Catch2 REQUIRED)
target_link_libraries(my_test PRIVATE Catch2::Catch2WithMain)
Importante: Nas versões do Catch2 v3.x e superiores, os matchers estão no namespace Catch::Matchers. Na versão v2.x, eles também estavam em Catch::Matchers (o mesmo, mas a estrutura dos arquivos de cabeçalho mudou). Para v3.x, use #include <catch2/catch_test_macros.hpp> e #include <catch2/matchers/catch_matchers_all.hpp>.
3. Início rápido — exemplo mínimo funcional
Vamos escrever um teste simples usando um matcher para verificar uma string:
// test.cpp
#define CATCH_CONFIG_MAIN // Esta linha deve estar em apenas um arquivo .cpp
#include <catch2/catch_test_macros.hpp>
#include <catch2/matchers/catch_matchers_all.hpp>
#include <string>
TEST_CASE("Matchers de string funcionam", "[string]") {
std::string hello = "Olá, Mundo!";
// Verifica se a string contém a substring
CHECK_THAT(hello, Catch::Matchers::ContainsSubstring("Mundo"));
// Verifica se a string começa com "Olá"
CHECK_THAT(hello, Catch::Matchers::StartsWith("Olá"));
// Verifica se a string termina com "!"
CHECK_THAT(hello, Catch::Matchers::EndsWith("!"));
}
Também na biblioteca
Parsing de HTML em TypeScript: bibliotecas, ferramentas e exemplos
Trabalhando com YAML em JavaScript (Node.js): parsing, geração e validação
Validação de dados em TypeScript: Zod, Yup e outras ferramentas
Validação de dados em Java: visão geral de bibliotecas e ferramentas