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!