Cobertura de teste é algo importante no desenvolvimento de software.
Testes garantem que seu software funciona do jeito que foi feito para funcionar e a cobertura de teste garante que você checou todas as possibilidades do seu código, ou seja um complementa o outro. Várias linguagens modernas em 50% dos casos vão ter uma biblioteca ou ferramenta para gerar um resumo dessa cobertura, mas você sabia que o C tem uma ferramenta """nativa""" para isso?
Vamos começar com um código bem simples que só retorna ±42:
#include <stdbool.h>
int return_42(bool ret_neg) {
if (ret_neg)
return -42;
return 42;
}
E agora o simples arquivo de teste:
#include <assert.h>
#include <stdbool.h>
#include <stdio.h>
int return_42(bool ret_neg);
int main() {
assert(return_42(false) == 42);
assert(return_42(true) == -42);
puts("Nice");
return 0;
}
Agora podemos compilar o código com gcc/cc utilizando as seguintes flags -fprofile-arcs
e -ftest-coverage
.
Isso vai gerar um executável e arquivos com a extensão .gcno
.
Com esses arquivos criados executamos o teste e após o fim da execução arquivos com a extensão .gcda
serão criados.
Com esses novos arquivos criados podemos passar eles pelo gcov, instale o gcov e depois execute-o passando o nome dos arquivos .gcda
e .gcno
(normalmente eles vão ter o mesmo nome do .c, mas eles podem ter outro nome), com isso teremos arquivos com a extensão .gcov
. O gcov já vai te dar um mini resumo sobre a cobertura, porém precisamos deixar isso mais visual já que você não vai ter 1 teste simples (eu por exemplo to extrapolando 120 testes em uma biblioteca).
Vamos utilizar agora o lcov, instale ele, utilize ele com as flags -c
, -d .
e -o foobar.info
, ele ira gerar o arquivo com o nome que você passou na flag -o
e também vai imprimir um resumo da cobertura, infelizmente esse resumo não diz quais funções foram vistas, mas com o arquivo .info criado podemos utilizar a flag -l foobar.info
e o lcov vai imprimir uma tabela com um resumo mais legível, porém ainda assim, só temos uma porcentagem, não conseguimos ver quais linhas foram checadas, então vamos para o último passo para tornarmos isso muito melhor de ser visualizado.
Simplesmente utilize genhtml
passando como argumento o foobar.info
e a flag -o bar_html
, o genhtml vai gerar uma pasta contendo todo o resumo da cobertura de uma forma muito mais legível (você pode abrir esse html como quiser, meu método favorito é com python -m http.server -d bar_html
).
Você também pode utilizar o clang, porém as flags mudam, eu não fui muito a fundo por não gostar tanto do clang e também por achar o resultado final mais feio, mas pelo que tentei tudo funciona utilizando llvm e tudo que você tem que fazer é instalar 2 ferramentas do llvm.
Para finalizar o genhtml é bem customizável com bastante flags, o meu normalmente é assim:
E bom, por hoje é só, até a próxima!
Top comments (0)