DEV Community

Cover image for Cobertura de teste em C existe e vou te ensinar a usar
Andrey_vdl
Andrey_vdl

Posted on

Cobertura de teste em C existe e vou te ensinar a usar

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;
}
Enter fullscreen mode Exit fullscreen mode

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;
}
Enter fullscreen mode Exit fullscreen mode

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).

arquivo index.html

arquivo foo.c.gcov.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:

Image description

Image description

E bom, por hoje é só, até a próxima!

Top comments (0)