网站搜索

javascript - 理解 Istanbul 的代码覆盖率


我刚刚开始使用一个示例文件(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 个语句被覆盖,而我根本没有写任何单元测试。

答案#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 )
================================================================================

答案#2

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