Node.js 如何生成vscode类型脚本扩展覆盖率报告
对于使用TypeScript构建的VSCode扩展,似乎不可能使用Node.js 如何生成vscode类型脚本扩展覆盖率报告,node.js,typescript,unit-testing,visual-studio-code,code-coverage,Node.js,Typescript,Unit Testing,Visual Studio Code,Code Coverage,对于使用TypeScript构建的VSCode扩展,似乎不可能使用工作服的覆盖率报告 目前,我正在为我们的项目添加测试用例,我找到了几种报告覆盖率的方法,但没有一种适合我 使用自定义TestRunner 很少提到定制测试跑步者,但我发现了一篇帖子。当我使用F5启动扩展测试时,它工作,但当我在控制台中运行npm run Test时,它不工作(完全没有覆盖输出) 我还试图理解博客文章中的定制运行程序(源代码),但我发现我无事可做,因为我不知道它为什么有效 使用nyc 摩卡咖啡非常强大,但我们不能利用
工作服的覆盖率报告
目前,我正在为我们的项目添加测试用例,我找到了几种报告覆盖率的方法,但没有一种适合我
使用自定义TestRunner
很少提到定制测试跑步者,但我发现了一篇帖子。当我使用F5
启动扩展测试时,它工作,但当我在控制台中运行npm run Test
时,它不工作(完全没有覆盖输出)
我还试图理解博客文章中的定制运行程序(源代码),但我发现我无事可做,因为我不知道它为什么有效
使用nyc
摩卡咖啡非常强大,但我们不能利用它。当我运行nyc./node\u modules/vscode/bin/test
时,我将获得0%的覆盖率:
我已经搜索了纽约市的问题页面,关于TS项目存在许多相同的0%覆盖率问题,但没有一个与我们的环境相同。主要区别在于,他们使用mocha
进行测试,与VSCode的/node\u modules/VSCode/bin/test
脚本不同,它将创建一个新的进程来运行测试js文件。我不知道怎么处理这件事
我搜索了所有的问题(mocha、tyc、istanbul、vscode等),但很少有问题(我没有找到任何添加自定义测试运行程序的问题)
有关更多信息,请参见,您可以将复制到项目的test/index.ts
文件中
演示azure管道配置
请注意,您必须使用sed
删除lcov.info
中SF
路径的.\..\
前缀:
之前:
SF:..\..\src\vs-picgo\index.ts
之后:
SF:src\vs-picgo\index.ts
演示项目:我用摩卡、纽约和VSCode完成了所有工作
您可以在中看到我的解决方案
基本上,在运行测试之前,我使用Babel将我的.ts
代码与@Babel/preset typescript
和Babel plugin istanbul
一起传输。这允许我跳过检测tsc
输出和使用重新映射istanbul
的复杂额外步骤
然后在测试运行程序中,我使用(没有真正记录的)NYCAPI在测试完成后将覆盖率写入磁盘
最后,在我的包脚本中,我在测试命令完成后运行nycreport
更新:在每次测试运行之前,您也需要删除.nyc\u输出
文件夹
src/test/index.js
从“纽约市”导入纽约市
导出异步函数run():Promise{
常数nyc=新的nyc()
等待nyc.createTempDirectory()
//创建摩卡测试
康斯特摩卡=新摩卡({
用户界面:“tdd”,
})
摩卡咖啡色(真)
const testsRoot=path.resolve(_dirname,“…”)
常量文件:数组=等待新承诺((解析、拒绝)=>
地球仪(
“**/**.test.js”,
{
cwd:testsRoot,
},
(错误,文件)=>{
如果(错误)拒绝(错误)
else解析(文件)
}
)
)
//将文件添加到测试套件
files.forEach(f=>mocha.addFile(path.resolve(testsRoot,f)))
const失败:number=等待新承诺(resolve=>mocha.run(resolve))
等待nyc.WriteCoraverageFile()
如果(故障>0){
抛出新错误(`${failures}测试失败。`)
}
}
我自己也为此奋斗了一段时间,直到它正常工作。要让它正常工作,有三个主要挑战:
纽约市实例的正确设置
防止启动时的竞争条件
捕获nyc
输出并在调试控制台中显示
你可以找到我的工作测试跑步者。我也在分享我的其他见解。请不要多次发布相同的内容!如,和。
SF:src\vs-picgo\index.ts
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.`)
}
}