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

Sco*_*ord 109 javascript testing code-coverage jasmine istanbul

我一直使用Jasmine进行单元测试,但最近我开始使用Istanbul来给我代码覆盖报告.我的意思是我得到他们试图告诉我的要点,但我不知道每个百分比代表什么(Stmts,Branches,Funcs,Lines).到目前为止谷歌搜索我一直无法找到可靠的解释/资源.

问题:就像我说的那样,我得到了它的要点,但有人可以发布正确的解释或链接到正确的解释吗?

第三个问题:有没有办法确定代码的哪些特定部分未被涵盖?到目前为止,我还没有真正地了解这份报告,我基本上在猜测.

-------------------|-----------|-----------|-----------|-----------|
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 |
-------------------|-----------|-----------|-----------|-----------|
Run Code Online (Sandbox Code Playgroud)

Amy*_*ini 186

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

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

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

在文件报告中:

  • 'E' 代表'else path not taken',这意味着对于标记的if/else语句,'if'路径已经过测试,但不是'else'.
  • 'I' 代表'if path not taken',这是相反的情况:'if'尚未经过测试.
  • xN在左栏是倍线已被执行的量.
  • 未执行的行或代码段将以红色突出显示.

这已经在伊斯坦布尔v0.4.0中得到验证,我不确定这是否仍然适用于后续版本,但由于该库是基于坚实的理论原则,对于较新的版本,行为不应该改变太多.

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

粉红色:未涵盖的陈述.

橙色:功能未涵盖.

黄色:分支未覆盖.

完整的伊斯坦布尔文档:

https://gotwarlost.github.io/istanbul/public/apidocs/index.html

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

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

希望能帮助到你!

  • 真棒!比起Instanbul docs¯\ _(ツ)_ /¯中的任何地方都更好地解释了 (6认同)
  • 我不明白的是它如何能够为我提供 100% 的语句覆盖率,但*在同一文件*上的函数收敛率却低于 100%。如果连所有函数都没有调用,怎么能100%覆盖语句呢?例如,我在覆盖报告中看到这一行:`index.js | 100 | 100 100 | 100 87.5 | 87.5 100 | 100 ` 其中列的顺序是 `File | % 语句 | % 分支 | % 函数 | % 行 | 未发现的行#s`。所以 100% 的语句覆盖率,没有未覆盖的行。但功能覆盖率只有87.5%。如何?? (2认同)

Yar*_*mer 7

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

涵盖的函数百分比由测试期间调用的函数数除以函数总数计算得出.行和语句也是如此(除非你有很长的语句,否则它们通常会彼此接近).分支意味着像if-else块一样的决策点.例如,假设您的代码只包含一个if-else语句,并且您的测试只传递if部分而不是else部分,那么您的分支百分比应为50%.

希望能让事情更加清晰.


mgp*_*mul 7

@StijndeWitt:你问了

我不明白的是它如何能够为我提供 100% 的语句覆盖率,但在同一文件上却无法实现 100% 的函数收敛。如果连所有的函数都没有被调用,怎么能100%的语句被覆盖呢?

所附的屏幕截图说明了线路覆盖率如何达到 100%,但功能覆盖率却较低。第 4、5 和 7 行算作行。第 3 行包含函数定义 (F1) 的行没有,但它显然包含一个函数。第 5 行还包含一个函数 (F2) 和一个附加语句。因此,在纽约市的计数世界中:

  • 行数 = 3
  • 语句 = 4(其中 1 条未涵盖)
  • 功能= 2(其中1个未涵盖)

显然,函数头不算“行”,但它们确实算作一个函数。这就解释了为什么行覆盖率可以达到 100%,而函数覆盖率(或语句覆盖率)却较低。 功能覆盖率小于00%