如何使用@vscode/test-cli测试TypeScript VSCode扩展时获取测试覆盖率
解决@vscode/test-cli与nyc的覆盖率收集问题
1. 确保TypeScript编译生成SourceMap
修改tsconfig.json,启用sourceMap以关联TypeScript源码与编译后的JS文件:
{ "compilerOptions": { // 保留原有配置,新增/修改以下项 "sourceMap": true, "inlineSourceMap": false } }
2. 修正.nycrc配置
调整规则确保只收集业务代码覆盖率,排除测试文件:
{ "extends": "@istanbuljs/nyc-config-typescript", "include": [ "src/**/*.ts", "out/**/*.js" ], "exclude": [ "src/**/*.test.ts", "out/test/**/*.js", "out-instrumented/**/*" ], "reporter": [ "text-summary", "html", "lcov" ], "report-dir": "coverage", "sourceMap": true, "instrument": true, "all": true }
3. 调整package.json的scripts脚本
替换原有coverage脚本,通过预instrument代码让VSCode加载带探针的扩展:
"scripts": { "pretest": "pnpm run compile && pnpm run lint", "test": "vscode-test", "coverage": "pnpm run compile && nyc instrument out out-instrumented && cp package.json package.json.tmp && sed -i 's/out\\/extension.js/out-instrumented\\/extension.js/' package.json && vscode-test --files out-instrumented/test/**/*.test.js && nyc report && mv package.json.tmp package.json" }
脚本逻辑说明:
- 先编译TypeScript代码到
out目录 - 用
nyc instrument生成带覆盖率探针的代码副本到out-instrumented - 临时修改
package.json的main字段,让VSCode加载instrumented版本的扩展 - 运行测试并生成覆盖率报告
- 恢复原始
package.json文件
4. 可选:简化测试配置
若不想在命令行指定测试文件路径,可修改.vscode-test.mjs:
import { defineConfig } from "@vscode/test-cli"; export default defineConfig({ files: "out-instrumented/test/**/*.test.js", });
注意:此修改会让普通测试(pnpm test)也使用instrumented代码,仅推荐固定使用coverage流程的场景。
原配置失效原因
直接用nyc pnpm run test无法生效,因为vscode-test会启动独立的VSCode进程,nyc的覆盖率探针无法注入到该子进程中。必须先对扩展代码做instrument预处理,让VSCode加载带探针的代码,才能正常收集覆盖率数据。
内容的提问来源于stack exchange,提问作者Roberto Mosca
相关产品推荐
相关产品推荐

