node.js - 如何生成 vscode TypeScript 扩展覆盖率报告
问题描述
使用 TypeScript 构建的 VSCode 扩展似乎coveralls
无法提供覆盖率报告。
目前,我正在向我们的项目https://github.com/PicGo/vs-picgo/pull/42添加测试用例,我找到了几种报告覆盖率的方法,但它们都不适合我。
使用自定义 TestRunner
官方文档几乎没有提到自定义测试运行器,但我在这里找到了一个帖子。当我使用F5
启动时它可以Extension Test
工作,但当我在控制台中运行时它不起作用npm run test
(根本没有覆盖输出)。
我也尝试过了解博文中的自定义运行器(源代码),但我发现我无所事事,因为我不知道它为什么会起作用。
使用nyc
nyc
with mocha 非常强大,但我们无法利用它。当我运行时nyc ./node_modules/vscode/bin/test
,我将获得 0% 的覆盖率:
我搜索了问题页面nyc
,存在很多关于 TS 项目的相同 0% 覆盖率问题,但没有一个与我们的环境相同。主要区别在于它们mocha
用于测试,不像 VSCode 的./node_modules/vscode/bin/test
脚本,它将创建一个新进程来运行测试 js 文件。我不知道该如何处理。
我搜索了所有问题(mocha、tyc、istanbul、vscode 等),很少(我没有找到任何)vscode TypeScripts 正在使用覆盖率报告供我复制。所以我的问题是:如何获得 VSCode TS 扩展的覆盖率报告?
解决方案
我用 Mocha、NYC 和 VSCode 完成了所有工作!
您可以在https://github.com/jedwards1211/vscode-extension-skeleton中看到我的解决方案。
基本上,我在运行测试之前使用 Babel 来编译我的.ts
代码。这使我可以跳过检测输出和使用.@babel/preset-typescript
babel-plugin-istanbul
tsc
remap-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.`)
}
}
推荐阅读
- sql-server - 无法将 QuickSight 连接到 SQL Server -“您的数据库生成了 SQL 异常”错误
- gradle - 如何使用 Gradle 和 Kotlin DSL 创建额外的 Kotlin SourceSet
- django - Django:在数据库中存储重要常量并在必要时加载到项目中
- android - 如何等到一堆电话结束再拨打另一个电话
- jpa - JPA Exception 非实体作为关系属性中的目标实体
- python - 为什么这段代码会出现无效的语法错误?
- c++ - C++模板函数创建问题
- php - preg_match 不适用于模式
- python - 如何检查数独板上的所有子网格,而不仅仅是一个
- database - 导入如何排除所有表空间?