You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 05:17:21