152

我一直使用 Jasmine 进行单元测试,但最近我开始使用伊斯坦布尔来给我代码覆盖率报告。我的意思是我明白他们试图告诉我的要点,但我真的不知道这些百分比中的每一个代表什么(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 |
-------------------|-----------|-----------|-----------|-----------|
4

4 回答 4

248

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

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

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

在文件报告中:

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

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

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

粉红色:未涵盖的陈述。

橙色:未涵盖的功能。

黄色:未覆盖的树枝。

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

https://istanbul.js.org

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

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

希望能帮助到你!

于 2016-04-18T14:58:57.140 回答
8

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

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

希望这能让事情更清楚。

于 2014-10-29T16:02:28.703 回答
1

@StijndeWitt:你问

我没有得到的是它如何给我 100% 的语句覆盖率,但少于 100% 的函数会聚在同一个文件上。如果甚至没有调用所有函数,怎么可能 100% 的语句被覆盖?

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

  • 行 = 3
  • 语句 = 4(其中 1 不包括在内)
  • 函数 = 2(其中 1 未涵盖)

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

于 2021-10-26T12:05:57.197 回答
0

添加到以前的答案

%Statements 的计算方法是取测试所涵盖的语句数的百分比,例如 12/18 * 100 = 66.67%。这意味着您的测试仅覆盖了 66.67%。

%Branch 也以相同的方式计算。您的 %Functions 和 %lines 也是如此。

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

显示测试结果输出的图像

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

于 2018-11-12T13:40:28.930 回答