TDD: Testando código C/C++ com Boost.Test

Neste post mostramos como utilizar a biblioteca Boost.Test para testar seus códigos. Podemos compilar a biblioteca junto aos testes, sendo também possível utilizar uma versão pré-compilada para melhorar o tempo de compilação.

Bibliotecas de teste são muito utilizados para “Desenvolvimento a partir de testes” (TDD – Test Driven Development).

No TDD desenvolvemos os códigos e seus testes em paralelo, para verificar que o código funciona e, mais importante, no futuro poder facilmente verificar se alguma mudança no código tenha causado um bug.

Instalando a biblioteca Boost.Test no Ubuntu Linux

Usamos o comando abaixo para realizar a instalação do G++ (compilador para C++) e biblioteca Boost.Test no Ubuntu 18.04.

sudo apt install g++ libboost-test-dev

Compilando Boost.Test com os testes

Esta é a forma mais simples de realizar a compilação, pois não necessita de opções adicionais.

Eis um código de exemplo.
Primeiro definimos o nome do módulo de testes como MeusTestes.
Em seguida incluímos o código da biblioteca Boost.Test.
Então criamos um teste chamado primeiro_teste.

// teste1.cpp
#define BOOST_TEST_MODULE MeusTestes
#include <boost/test/included/unit_test.hpp>

BOOST_AUTO_TEST_CASE(primeiro_teste) {
  int i = 1;
  BOOST_TEST(i == 1); // Sucesso
  BOOST_TEST(i == 2); // Falha
}

O código do teste pode declarar variáveis, chamar funções, etc… tudo que for possível fazer com C/C++.

Usamos a macro BOOST_TEST() para verificar se alguma expressão é verdadeira. Caso seja falsa, a expressão cuja verificação falha é registrada.

Para compilar use o comando a seguir.

g++ -o teste1 teste1.cpp

A compilação é razoavelmente lenta, demorando cerca de 12 segundos.

Para executar o programa com os testes usamos o comando a seguir.

./teste1

Além do tempo de compilação alto este método tem outro ponto fraco: é necessário que todos os testes estejam em um único arquivo. Portanto, não é possível dividir os testes em vários arquivos. Em pouco tempo temos arquivos de teste com vários milhares de linhas…

Utilizando Boost.Test pré-compilado

Esta é a forma mais rápida de realizar a compilação, pois não é necessário compilar toda a biblioteca junto com os testes. Também podemos dividir os testes em diversos arquivos. Precisamos, no entanto fornecer uma opção adicional ao compilador.

Eis um código de exemplo.
Primeiro definimos o nome do módulo de testes como MeusTestes.
Definimos a macro que indica que será utilizado uma biblioteca compartilhada dinamicamente linkada (dynamically linked shared library).
Em seguida incluímos o cabeçalho da biblioteca Boost.Test.
Então criamos um teste chamado primeiro_teste.

// teste2a.cpp
#define BOOST_TEST_MODULE MeusTestes
#define BOOST_TEST_DYN_LINK
#include <boost/test/unit_test.hpp>

BOOST_AUTO_TEST_CASE(primeiro_teste) {
  int i = 1;
  BOOST_TEST(i == 1); // Sucesso
  BOOST_TEST(i == 2); // Falha
}

Apenas UM dos arquivos de testes deve ter a definição do nome do módulo. Eis um segundo código de exemplo.

// teste2b.cpp
#define BOOST_TEST_DYN_LINK
#include <boost/test/unit_test.hpp>

BOOST_AUTO_TEST_CASE(segundo_teste) {
  int i = 2;
  BOOST_TEST(i == 2); // Sucesso
  BOOST_TEST(i == 3); // Falha
}

Para compilar os dois arquivos use o comando a seguir, onde temos que fornecer a opção adicional -lboost_unit_test_framework, para que o compilador realize a linkagem do programa com os testes com biblioteca pré-compilada.

g++ -o teste2 teste2a.cpp teste2b.cpp -lboost_unit_test_framework

A compilação é bem mais rápida, demorando cerca de 2 segundos.

Para executar o programa com os testes usamos o comando a seguir.

./teste2

Quero mais!

Você pode ainda complementar o uso de uma suíte de testes avaliando a cobertura do código com uma ferramenta como Gcov, como podemos ver no post TDD: Testando código C/C++ com Gcov.

Agora que já teve o pontapé inicial, tem um teste usando a biblioteca Boost.Test compilando e rodando, é fácil prosseguir por conta:
Veja a documentação sobre a biblioteca Boost.Test 1.73.0.

Até mais!

 

Leia mais:

Veja mais posts da Categoria Programação!

Autor: Djones Boni

Engenheiro Eletricista.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *