我如何阅读伊斯坦布尔报道报告?


131

我一直使用Jasmine进行单元测试,但是最近我开始使用Istanbul给我代码覆盖率报告。我的意思是我得到的要点是什么,他们是想告诉我,但我真的不知道这些百分比代表(撑条,树枝,funcs中,线)。到目前为止,谷歌搜索我一直找不到可靠的解释/资源。

问题:就像我说的那样,它的要旨是什么,但是有人可以发布正确的解释或指向正确解释的链接吗?

第三级问题:有什么方法可以确定代码的哪些特定部分未被涵盖?到目前为止,我基本上没有猜测这个报告。

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

3
运行istanbul还应该为报告生成一个HTML文件(应该在coverage文件夹中)。这个HTML应该给你向下钻取信息,当您点击文件/文件夹
亚龙施维默

谢谢@yarons。这绝对有助于深入研究覆盖范围,并确定具体未覆盖的范围。我还没有真正理解深度是什么意思百分比= /。
Scott Sword

Answers:


217

有很多覆盖标准,主要是:

  • 功能覆盖范围是否已调用程序中的每个功能(或子例程)?
  • 语句覆盖范围程序中的每个语句是否都已执行?
  • 分支覆盖范围是否已执行每个控制结构(如if和case语句中)的每个分支(也称为DD路径)?例如,给定一个if语句,是否同时执行了true和false分支?换句话说,程序中的每个边都执行了吗?
  • 行覆盖率是否已执行源文件中的每个可执行行?

对于每种情况,百分比代表已执行代码未执行代码,后者等于百分比格式的每个分数(例如:50%分支,1/2)。

在文件报告中:

  • 'E' 代表“未采用其他路径”,这意味着对于标记的if / else语句,“ if”路径已经过测试,但没有经过测试。
  • 'I' 代表“如果未采用路径”,这是相反的情况:“如果”未经测试。
  • xN左列是线已被执行的次数的量。
  • 未执行的行或代码段将以红色突出显示。

它已针对Istanbul v0.4.0进行了验证,我不确定这是否仍适用于后续版本,但是由于该库基于扎实的理论原理,因此对于较新的版本,其行为不应有太大变化。

它还提供了一些颜色代码-

粉色:声明未涵盖。

橙色:功能未涵盖。

黄色:树枝未覆盖。

完整的伊斯坦布尔文档在这里:

https://istanbul.js.org

有关代码覆盖率的更深入理论:

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

希望能帮助到你!


8

运行istanbul还应该为报告生成一个HTML文件(应该在coverage文件夹中)。当您单击文件/文件夹时,此HTML应该为您提供深入信息。

涵盖的功能百分比由测试期间调用的功能数量除以功能总数得出。行和语句也是如此(除非您的语句很长,否则它们通常会彼此靠近)。分支意味着决策点,如if-else块。例如,假设您的代码仅包含一个if-else语句,并且您的测试仅通过if部分而不通过else部分,那么您的分支百分比应为50%。

希望事情变得更清楚。


我通过指定伊斯坦布尔跑"test" : "nyc mocha"package.json。我的coverage文件夹为空。有什么想法吗?
TheCrazyProgrammer

1
我添加了HTML记者。现在可以使用了。"test" : "nyc --reporter=html mocha"
TheCrazyProgrammer

例如:如果您有一个大的if分支和一个很小的else分支,并且只运行了if分支,则行覆盖率看起来不错,但分支覆盖率仍然仅为50%。另外,如果语句之间用分号分隔,或者该行包含函数定义(包含其自己的语句),则每行可以有多个语句。如果语句在最后的分号之前有换行符,则每个语句可以有多行。
Hew Wolff

0

添加到以前的答案

%Statements是通过占测试覆盖的语句数的百分比来计算的,例如12/18 * 100 = 66.67%。这意味着您的测试仅涵盖66.67%。

%Branch也以相同的方式计算。同样,您的%Function和%lines。

在项目根目录中,有一个coverage文件夹,其中包含测试的HTML输出。单击它,然后在浏览器中查看。你应该看到这样的东西

该图显示了测试结果的输出

希望这可以帮助您更好地理解它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.