【问题标题】:Show real test coverage without 'Ignore' annotations in Istanbul在伊斯坦布尔显示没有“忽略”注释的真实测试覆盖率
【发布时间】:2022-11-11 01:16:37
【问题描述】:

是否可以显示伊斯坦布尔的实际代码覆盖率,而忽略“忽视”注释?

例如下一个实际上不要忽略:

/* istanbul ignore next */

我们的覆盖率报告了 100% 的覆盖率,但在代码中被忽略了。

【问题讨论】:

  • 所以你想同时忽略而不是忽略一段代码?听起来像是错误的方法。
  • 它更多地用于记录真实覆盖范围的指标。添加针对忽略的 lint 规则可能是返回真实覆盖率的更好方法。
  • 您是否尝试过查看 HTML 报告以获得跳过语句的可视化表示?可能能够减去那些以获得真正的覆盖范围。

标签: javascript unit-testing istanbul


【解决方案1】:

我意识到这不是你想听到的答案,但对我来说,这是唯一合乎逻辑的答案:从你的代码库中删除这些行。

让我解释一下为什么: 这些行的唯一功能是确保以下行/语句不包含在覆盖结果中。因此,如果您不希望它被忽略,请删除这些行。

如果出于某种原因,您真的想将这些行保留在代码库中。您可以考虑基于 CI 的解决方案。 创建一个作业,首先删除您想要删除的所有行。 像这样的东西:

for file in *.js
do
    sed '/istanbul ignore/d' "$file" > "$file".new_file.js
    mv "$file".new_file.js "$file".js
done

然后像往常一样计算代码覆盖率。

但是,由于这会更改所有文件,因此在本地运行并不理想,因为您可能需要在之后 git-revert 所有更改。因此,我建议使用 CI,因为在那里您可以简单地结束工作并忽略您所做的更改。

【讨论】:

  • 作为补充说明:互联网上似乎存在一些混淆,即在运行测试时该行忽略了这些行。但正如你提到的,情况并非如此。测试对所有行都运行正常,并且仅在计算覆盖率时才被忽略(我知道我只是重复了您所说的话,但我觉得应该强调这一点。
【解决方案2】:

正如您在评论中所建议的那样,添加一条 lint 规则以防止使用 /* istanbul ignore ... */,这可能是最好的解决方案。

但是,由于 Istanbul 是开源 JavaScript 软件,您也可以轻松修改它,使其忽略 /* istanbul ignore ... */ 语句。这是一个快速而肮脏的临时解决方案(正确的解决方案是分叉项目,修改源代码,构建和安装它):

  1. 在项目的node_modules 文件夹中找到一个或多个Istanbul 依赖项。
  2. 搜索 /^s*istanbuls+ignores+,它是正则表达式模式的一部分,Istanbul 使用它来正确识别忽略 cmets。
  3. 修改找到的源文件中的模式,例如将istanbul 和/或ignore 更改为其他一些术语(或摆脱整个机制,但这可能更困难且风险更大)。

    我不推荐这种方法。我只是想表明,这是可以做到的。根据您的具体设置,实施起来可能容易或困难。我刚刚在 VS Code 中使用 ES 2015 项目进行了尝试,它运行良好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-26
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    • 2016-07-22
    • 2018-07-13
    • 1970-01-01
    相关资源
    最近更新 更多