首页 > 解决方案 > 如何生成 vscode TypeScript 扩展覆盖率报告

问题描述

使用 TypeScript 构建的 VSCode 扩展似乎coveralls无法提供覆盖率报告。

目前,我正在向我们的项目https://github.com/PicGo/vs-picgo/pull/42添加测试用例,我找到了几种报告覆盖率的方法,但它们都不适合我。

使用自定义 TestRunner

官方文档几乎没有提到自定义测试运行器,但我在这里找到了一个帖子。当我使用F5启动时它可以Extension Test工作,但当我在控制台中运行时它不起作用npm run test(根本没有覆盖输出)。

我也尝试过了解博文中的自定义运行器(源代码),但我发现我无所事事,因为我不知道它为什么会起作用。

使用nyc

nycwith mocha 非常强大,但我们无法利用它。当我运行时nyc ./node_modules/vscode/bin/test,我将获得 0% 的覆盖率:

20190525000930

我搜索了问题页面nyc,存在很多关于 TS 项目的相同 0% 覆盖率问题,但没有一个与我们的环境相同。主要区别在于它们mocha用于测试,不像 VSCode 的./node_modules/vscode/bin/test脚本,它将创建一个新进程来运行测试 js 文件。我不知道该如何处理。

我搜索了所有问题(mocha、tyc、istanbul、vscode 等),很少(我没有找到任何)vscode TypeScripts 正在使用覆盖率报告供我复制。所以我的问题是:如何获得 VSCode TS 扩展的覆盖率报告?

标签: node.jstypescriptunit-testingvisual-studio-codecode-coverage

解决方案


我用 Mocha、NYC 和 VSCode 完成了所有工作!

您可以在https://github.com/jedwards1211/vscode-extension-skeleton中看到我的解决方案。

基本上,我在运行测试之前使用 Babel 来编译我的.ts代码。这使我可以跳过检测输出和使用.@babel/preset-typescriptbabel-plugin-istanbultscremap-istanbul

然后在测试运行程序中,我使用(未真正记录)NYC API 在测试完成后将覆盖率写入磁盘。

最后,在我的包脚本中,我nyc report在测试命令完成后运行。

更新:您也需要.nyc_output在每次测试运行之前删除该文件夹。

src/test/index.js

import NYC from 'nyc'

export async function run(): Promise<void> {
  const nyc = new NYC()
  await nyc.createTempDirectory()
  // Create the mocha test
  const mocha = new Mocha({
    ui: 'tdd',
  })
  mocha.useColors(true)

  const testsRoot = path.resolve(__dirname, '..')

  const files: Array<string> = await new Promise((resolve, reject) =>
    glob(
      '**/**.test.js',
      {
        cwd: testsRoot,
      },
      (err, files) => {
        if (err) reject(err)
        else resolve(files)
      }
    )
  )

  // Add files to the test suite
  files.forEach(f => mocha.addFile(path.resolve(testsRoot, f)))

  const failures: number = await new Promise(resolve => mocha.run(resolve))
  await nyc.writeCoverageFile()

  if (failures > 0) {
    throw new Error(`${failures} tests failed.`)
  }
}

推荐阅读