【问题标题】:How do I read an Istanbul Coverage Report?如何阅读伊斯坦布尔覆盖报告?
【发布时间】:2014-12-24 10:37:27
【问题描述】:

我一直使用 Jasmine 进行单元测试,但最近我开始使用 Istanbul 来为我提供代码覆盖率报告。我的意思是我得到了他们试图告诉我的gist,但我真的不知道这些百分比中的每一个代表什么(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 |
-------------------|-----------|-----------|-----------|-----------|

【问题讨论】:

  • 运行 istanbul 还应该为报告生成一个 HTML 文件(应该在 coverage 文件夹中)。当您单击文件/文件夹时,此 HTML 应为您提供深入信息
  • 谢谢@yarons。这绝对有助于深入了解覆盖范围并确定未覆盖的具体内容。我仍然没有真正理解深入百分比的含义=/。

标签: javascript testing jasmine code-coverage istanbul


【解决方案1】:

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

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

希望能让事情更清楚。

【讨论】:

  • 我通过在package.json 中指定"test" : "nyc mocha" 来运行伊斯坦布尔。我的覆盖文件夹是空白的。想法?
  • 我添加了 html 记者。现在可以了。 "test" : "nyc --reporter=html mocha"
  • 举个例子:如果你有一个大的 if-branch 和一个小的 else-branch,并且只运行了 if-branch,线路覆盖率看起来不错,但分支覆盖率仍然只有50%。此外,如果语句用分号分隔或者如果该行包含函数定义(包含其自己的语句),则每行可以有多个语句。如果语句在最后一个分号之前有换行符,则每个语句可以有多行。
【解决方案2】:

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

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

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

在文件报告中:

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

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

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

粉红色:声明未涵盖。

橙色:未涵盖的功能。

黄色:树枝没有被覆盖。

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

https://istanbul.js.org

更深入的代码覆盖理论:

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

希望对你有帮助!

【讨论】:

  • 我不明白的是,它如何为我提供 100% 的语句覆盖率,但小于 100% 的函数收敛在同一个文件上。如果甚至没有调用所有函数,怎么可能 100% 的语句被覆盖?例如。我在我的报道报告中得到了这一行:index.js | 100 | 100 | 87.5 | 100 | ,其中列的顺序是File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s。所以 100% 的语句覆盖率,没有未覆盖的行。但只有 87.5% 的功能覆盖率。怎么样??
  • 我从纽约顺便得到这些结果,但原理是一样的,对吧?
【解决方案3】:

添加到以前的答案

%Statements 是根据测试涵盖的语句数的百分比计算得出的,例如 12/18 * 100 = 66.67%。这意味着您的测试只覆盖了 66.67%。

%Branch 也以相同的方式计算。同样适用于您的 %Functions 和 % 行。

在您的项目根目录中,有一个覆盖文件夹,其中包含您的测试的 HTML 输出。单击它并在浏览器中查看它。您应该会看到类似这样的内容

Image showing the output of your test results

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

【讨论】:

    【解决方案4】:

    @StijndeWitt:你问过

    我不明白它如何能够为我提供 100% 的语句覆盖率,但是 少于 100% 的函数在同一个文件上收敛。怎么可能100 即使不是所有功能,也涵盖了百分比的语句 被叫了?

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

    • 行 = 3
    • 语句 = 4(其中 1 未涵盖)
    • functions = 2(其中 1 未涵盖)

    显然,函数标题不算作“行”,但它们确实算作一个函数。这就解释了为什么行覆盖率可以是 100%,而函数覆盖率(或语句覆盖率)则更少。

    【讨论】:

      猜你喜欢
      • 2013-12-21
      • 2014-05-15
      • 2020-08-20
      • 2014-10-07
      • 1970-01-01
      • 1970-01-01
      • 2018-05-25
      • 2016-07-22
      • 2019-02-01
      相关资源
      最近更新 更多