Realizar testes automáticos de diversas partes do seu software é uma prática que vem ganhando bastante reconhecimento últimamente juntamente com o paradigma da programação orientada a teste (Test Driven Development). A técnica do TDD “formalizada” no excelente livro de Kent Beck (recomendadíssimo) deu seus primeiros passos no Java com o framework JUnit e rapidamente foi sendo incorporada em outras linguagens.

O que me leva a um ponto importante. Eu faço muitos poucos testes nos meus softwares e embora isto se deva em parte pela preguiça e pela falta de prática eu gosto de creditar isto também a não conhecer nenhum bom framework de testes para C/C++ que acabam sendo minhas linguagens escolhidas para fazer diversos projetos.

Ok, shame on me.

Existem vários e eu resolvi tentar pegar um e usar. À primeira vista eu tentei o Cutest mas achei ele meio complicado demais e muito cheio de firulas, tinha que suar muito só pra começar a escrever algumas coisinhas simples. Depois de dar uma fuçada e conversar com algum pessoal que também estava interessado no assunto eu cheguei num chamado simplectest e gostei bastante.

Simplicidade no talo

Um programador, um editor de texto e um arquivo header. É tudo que você precisa para começar a fazer seus testes com o simplectest. Um exemplo de um programa simples seria

//arquivo hello.c
#include "tests.h"

START_TESTS()

  //nosso hello world
  START_TEST("Testa 1 == 1")
    ASSERT(1 == 1)
  END_TEST()

END_TESTS()

E rodando este teste temos o seguinte output

> Testa 1 == 1...

--- Results ---
Tests run:    1
Passes:       1
Failures:     0

Uma explicação rápida

Esta biblioteca é baseada fortemente sobre a construção de alguns macros do pré-processador, coisa que alguns mais experientes em C poderiam achar meio tensa. Entretanto eu simpatizei, porque afinal de contas este código não vai estar misturado com a sua aplição, seus testes rodam num mundinho separado.

Algumas instruções rápidas para começar.

  • Colocamos os nossos testes entre as chamadas START_TESTS() e END_TESTS().
  • Cada teste deve ser declarado com START_TEST( "string descrevendo o que o teste faz" ) (note que este está no singular) e deve ser fechado com END_TEST().
  • Escreva dentro a lógica do teste . Temos à disposição uma gama bem variada de ASSERTs, porém na maior parte das vezes dá pra ficar com o clássico ASSERT(exp) que irá falhar caso exp avalie para falso.
  • Para descobrir os asserts disponíveis dê uma lida no .h, não tem treta pessoal

Exemplo completo de FizzBuzz e mais instruções

Fiquei com preguiça de copiar tudo pra cá então vocês podem encontrar nesta página aqui que é a minha wiki.