如何使用 istanbul 全面覆盖 CLI nodeJS 应用程序?

How to get full coverage of a CLI nodeJS app with istanbul?

我正在使用此配置:Istanbul/Mocha/Chai/supertest(用于 http 测试)/sinon(用于计时器测试)但是我在测试 CLI 工具时遇到了一些问题

我的问题很简单:如何测试我的 cli 程序并同时使用 istanbul 实现 100% 的代码覆盖率?不管你用的是什么工具,我都想知道你是怎么做的!

我发现这篇文章一开始很有帮助,但

干杯

这将分两步完成:

  1. 确保您的测试套件已设置为正确生成 CLI 执行
  2. 设置 nyc(从 istanbul 切换到 nyc 的原因如下所述)以查看 CLI 工具背后的脚本文件

设置你的测试以运行产生子进程

几个月前,我不得不在 Fulky 上设置一些 CLI 测试(该项目现在暂停,但它是临时的)并这样编写了我的测试套件:

const expect = require('chai').expect;
const spawnSync = require('child_process').spawnSync;

describe('Executing my CLI tool', function () {
  // If your CLI tool is taking some expected time to start up / tear down, you
  // might want to set this to avoid slowness warnings.
  this.slow(600);

  it('should pass given 2 arguments', () => {
    const result = spawnSync(
      './my-CLI-tool',
      ['argument1', 'argument2'],
      { encoding: 'utf-8' }
    );

    expect(result.status).to.equal(0);
    expect(result.stdout).to.include('Something from the output');
  });
});

您可以看到 an example here 但请记住,这是一个带有 Mocha 的测试文件 运行,运行s Mocha 在生成的进程中。 这里有一些 Inception 可以满足您的需要,所以它可能会让人感到困惑,但它正在测试一个 Mocha 插件,因此增加了大脑游戏。如果您忘记了这种复杂性,那应该适用于您的用例。

设置覆盖范围

然后您将需要使用 npm i nyc --save-dev 安装 nyc,这是现在用于伊斯坦布尔的 CLI 工具,因为与以前的 CLI(istanbul 本身)不同,它允许覆盖产生子进程的应用程序。 好消息是 nyc 背后仍然是相同的工具、相同的团队等,因此切换非常简单(例如,参见 this transition)。

在你的 package.json 中,然后添加到你的 scripts:

"scripts": {
  "coverage": "nyc mocha"
}

然后您将获得一份包含 npm run coverage 的报告(您可能必须在 .nycrc 中设置 reporter 选项),该报告也会通过您的 CLI 脚本。

我还没有为上面提到的项目设置这个覆盖部分,但我刚刚在本地应用了这些步骤并且它按预期工作所以我邀请你在你的最后尝试一下。