【问题标题】:Understanding Istanbul's code coverage了解伊斯坦布尔的代码覆盖率
【发布时间】:2014-05-19 23:43:41
【问题描述】:

我刚开始使用包含以下语句的示例文件 (example.js):

x = 42;
if(false)
  x = -1;

我没有任何单元测试文件。但是当我跑步时

istanbul cover example.js 

我看到下面的一些覆盖率数据

=============================== Coverage summary ===============================
Statements   : 66.67% ( 2/3 )
Branches     : 50% ( 1/2 )
Functions    : 100% ( 0/0 )
Lines        : 66.67% ( 2/3 )
==============================================================================

这是否意味着我有 3 个语句中的 2 个语句被涵盖?如果是这样,当我没有任何针对该代码的单元测试文件时,它如何报告该代码已被覆盖?

根据我对代码覆盖率定义的理解,它是由单元测试覆盖的代码。我不明白为什么 istabul 说我在没有编写任何单元测试的情况下涵盖了 2 个语句。

【问题讨论】:

  • 3 个语句中的 2 个将始终执行,1 个永远不会执行。无论您在提供的示例代码上运行什么测试,这都是正确的。

标签: javascript code-coverage istanbul


【解决方案1】:

Istanbul 检查运行了哪些代码行。简单地运行文件将执行其中两行,而忽略第三行。如果你要创建这样的东西:

module.exports = {
  myFunc: function() {
    x = 42;
    if(false) {
      x = -1;
    }
  }
};

您会得到不同的结果(x = 42 根本不会运行)。执行的一条语句是module.exports

=============================== Coverage summary ===============================
Statements   : 25% ( 1/4 )
Branches     : 0% ( 0/2 )
Functions    : 0% ( 0/1 )
Lines        : 25% ( 1/4 )
================================================================================

【讨论】:

  • 当我只有函数(而不是变量赋值)时,为什么我的语句覆盖率仍然为 1?我没有任何调用该函数的语句。
  • @iRamesh 函数声明作为运行文件的一部分运行。
  • 分支统计是从什么产生的?
  • @streetlight 分支是if/elseswitch 语句等。
【解决方案2】:

example.js 假设是测试文件。如果您想包含源代码,请使用--include-all-sources 运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-02
    • 2015-08-26
    • 2019-04-28
    • 2015-07-29
    • 2015-09-10
    • 2014-05-15
    • 2020-08-20
    • 1970-01-01
    相关资源
    最近更新 更多