Testes em C++: frameworks e ferramentas para verificação de código

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Testes em C++: visão geral de frameworks e ferramentas



Testes são uma parte essencial do desenvolvimento profissional em C++. Ao contrário de linguagens com tipagem dinâmica, C++ exige atenção especial ao gerenciamento de memória, RAII e metaprogramação com templates. Sem testes de qualidade, mesmo uma pequena refatoração pode levar a erros difíceis de detectar. Neste artigo, abordaremos os principais frameworks para testes unitários em C++, suas características e exemplos de uso.



Por que testar código C++?

Principais razões para implementar testes:

  • Segurança na refatoração — os testes fixam o comportamento correto antes das alterações.
  • Documentação — os testes mostram como usar a API.
  • Detecção de regressões — verificação automática após cada commit.
  • Validação de casos limite — trabalho com nullptr, contêineres vazios, estouro.


Frameworks populares para C++



1. Google Test (gtest)

O framework mais comum, do Google. Suporta registro automático de testes, macros ASSERT_* e EXPECT_*, testes parametrizados, mocks via Google Mock.

#include <gtest/gtest.h>

int add(int a, int b) { return a + b; }

TEST(AdditionTest, PositiveNumbers) { EXPECT_EQ(add(2, 3), 5); EXPECT_EQ(add(0, 0), 0);}

TEST(AdditionTest, NegativeNumbers) { EXPECT_EQ(add(-1, -2), -3);}

int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS();}

Características:

  • Suporte a death tests para verificar assert.
  • Fábrica de mocks (gmock) para isolar dependências.
  • Integração com CMake (find_package(GTest)).


2. Catch2

Framework moderno com sintaxe expressiva. Não requer registro separado de testes — basta a macro TEST_CASE. Suporta estilo BDD (Given-When-Then).

#include <catch2/catch_test_macros.hpp>

int factorial(int n) { return n <= 1 ? 1 : n * factorial(n - 1);}

TEST_CASE("Factorials are computed", "[math]") { REQUIRE(factorial(0) == 1); REQUIRE(factorial(1) == 1); REQUIRE(factorial(5) == 120);}

TEST_CASE("Negative input", "[math][edge]") { REQUIRE_THROWS_AS(factorial(-1), std::domain_error);}

Características:

  • Geração de dados de teste (GENERATE).
  • Divisão de testes em seções (SECTION).
  • Seleção automática de main() (se definir CATCH_CONFIG_MAIN).


3. doctest

Framework leve e rápido, tempo de compilação mínimo. Ideal para projetos onde a velocidade de build é importante. Sintaxe semelhante ao Catch2.

#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN#include <doctest/doctest.h>

int divide(int a, int b) { if (b == 0) throw std::invalid_argument("division by zero"); return a / b;}

TEST_CASE("Division") { CHECK(divide(10, 2) == 5); CHECK_THROWS_AS(divide(5, 0), std::invalid_argument);}

Características:

  • Compilação muito rápida (arquivo de cabeçalho ~5 KB).
  • Suporte às macros CHECK, REQUIRE, WARN.
  • Relator integrado em XML/JSON.


4. Boost.Test

Parte das bibliotecas Boost. Possui recursos ricos, mas requer mais código boilerplate. Suporta registro automático e manual de testes.

#define BOOST_TEST_MODULE MyTest#include <boost/test/included/unit_test.hpp>

BOOST_AUTO_TEST_SUITE(MathTests)

BOOST_AUTO_TEST_CASE(TestSum) { BOOST_CHECK_EQUAL(2 + 2, 4); BOOST_CHECK_CLOSE(3.14159, 3.14, 0.1); // precisão 0.1%}

BOOST_AUTO_TEST_CASE(TestFail) { BOOST_REQUIRE_MESSAGE(false, "This test always fails");}

BOOST_AUTO_TEST_SU

Recommendations