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!

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

Top comments (0)

nextjs tutorial video

Youtube Tutorial Series 📺

So you built a Next.js app, but you need a clear view of the entire operation flow to be able to identify performance bottlenecks before you launch. But how do you get started? Get the essentials on tracing for Next.js from @nikolovlazar in this video series 👀

Watch the Youtube series