Como leio um relatório de cobertura de Istambul?

131

Eu sempre usei o Jasmine para meus testes de unidade, mas recentemente comecei a usar Istambul para me fornecer relatórios de cobertura de código. Quer dizer, eu obter a essência do que eles estão tentando me dizer, mas eu realmente não sei o que cada uma destas percentagens representam (stmts, Ramos, Funcs, linhas). Até agora, pesquisando no Google, não consegui encontrar uma explicação / recurso sólido.

Pergunta : Como eu disse, entendi a essência, mas alguém pode postar uma explicação adequada ou um link para uma explicação adequada?

Pergunta terciária : Existe alguma maneira de identificar quais partes específicas do seu código não são cobertas? Até agora, sem realmente reclamar deste relatório, estou basicamente supondo.

-------------------|-----------|-----------|-----------|-----------|
File               |   % Stmts |% Branches |   % Funcs |   % Lines |
-------------------|-----------|-----------|-----------|-----------|
   controllers/    |      88.1 |     77.78 |     78.57 |      88.1 |
      dashboard.js |      88.1 |     77.78 |     78.57 |      88.1 |
-------------------|-----------|-----------|-----------|-----------|
All files          |      88.1 |     77.78 |     78.57 |      88.1 |
-------------------|-----------|-----------|-----------|-----------|
Scott Sword
fonte
3
A execução de Istambul também deve produzir um arquivo HTML para o relatório (deve estar na pasta de cobertura). Esse HTML deve fornecer informações detalhadas quando você clica em arquivos / pastas
Yaron Schwimmer
Obrigado @yarons. Isso definitivamente ajuda a aprofundar a cobertura e a identificar o que especificamente não está sendo coberto. Eu ainda realmente não entendo a fundo o que as percentagens média = /.
Scott Espada

Respostas:

217

Existem vários critérios de cobertura, sendo os principais:

  • Cobertura das funções Cada função (ou sub-rotina) do programa foi chamada?
  • Cobertura de declarações Cada declaração do programa foi executada?
  • Cobertura de ramificação Cada ramificação (também chamada de caminho DD) de cada estrutura de controle (como nas instruções if e case) foi executada? Por exemplo, dada uma instrução if, os desvios true e false foram executados? Outra maneira de dizer isso é: todas as arestas do programa foram executadas?
  • A cobertura de linha foi executada em cada linha executável do arquivo de origem?

Para cada caso, a porcentagem representa código executado versus código não executado , que é igual a cada fração no formato percentual (por exemplo: 50% ramificações, 1/2).

No relatório do arquivo:

  • 'E' significa 'else path not taken', o que significa que, para a instrução if / else marcada, o caminho 'if' foi testado, mas não o 'else'.
  • 'I' significa 'se o caminho não for seguido', que é o caso oposto: o 'se' não foi testado.
  • A xNcoluna da esquerda é a quantidade de vezes que a linha foi executada.
  • Linhas não executadas, ou partes de código, serão destacadas em vermelho.

Isso foi verificado no Istanbul v0.4.0, não tenho certeza se isso ainda se aplica às versões subseqüentes, mas, como a biblioteca é baseada em princípios teóricos sólidos, o comportamento não deve mudar muito para as versões mais recentes.

Ele também fornece alguns códigos de cores -

Rosa : declarações não cobertas.

Laranja : funções não cobertas.

Amarelo : galhos não cobertos.

Documentos completos de Istambul aqui:

https://istanbul.js.org

Para uma teoria mais aprofundada sobre cobertura de código:

https://en.wikipedia.org/wiki/Code_coverage

Espero que ajude!

Amy Pellegrini
fonte
8

A execução de Istambul também deve produzir um arquivo HTML para o relatório (deve estar na pasta de cobertura). Esse HTML deve fornecer informações detalhadas quando você clica em arquivos / pastas.

A porcentagem de funções cobertas é calculada pelo número de funções chamadas durante os testes, dividido pelo número total de funções. O mesmo vale para linhas e declarações (que geralmente estarão próximas umas das outras, a menos que você tenha declarações muito longas). Ramos significam pontos de decisão como if-elseblocos. Por exemplo, digamos que seu código contenha apenas uma if-elseinstrução e seus testes passem apenas pela ifparte, mas não pela elseparte, a porcentagem de suas ramificações deve ser de 50%.

Espero que isso torne as coisas mais claras.

Yaron Schwimmer
fonte
Corri Istambul, especificando "test" : "nyc mocha"no package.json. Minha pasta de cobertura está em branco. Pensamentos?
TheCrazyProgrammer
1
Eu adicionei o repórter html. Funciona agora. "test" : "nyc --reporter=html mocha"
TheCrazyProgrammer
Como um exemplo: se você tiver uma ramificação if grande e uma ramificação minúscula, e apenas a ramificação if for executada, a cobertura da linha ficará ótima, mas a cobertura da ramificação ainda será de apenas 50%. Além disso, você pode ter várias instruções por linha se as instruções forem separadas por ponto e vírgula ou se a linha incluir uma definição de função (que contém suas próprias instruções). Você pode ter várias linhas por instrução se a instrução tiver quebras de linha antes do ponto e vírgula final.
Hew Wolff
0

Adicionando às respostas anteriores

As% Declarações são calculadas considerando uma porcentagem do número de declarações cobertas pelo seu teste, por exemplo, 12/18 * 100 = 66,67%. Isso significa que seu teste cobriu apenas 66,67%.

A% Ramificação também é calculada da mesma maneira. O mesmo para% Functions e% lines.

No diretório raiz do projeto, há uma pasta de cobertura que contém a saída HTML do seu teste. Clique nele e visualize-o no navegador. Você deve ver algo assim

Imagem mostrando a saída dos resultados do teste

Espero que isso ajude você a entender melhor.

Samuel Pinheiro
fonte