评估版本。下列所有功能在免费的 14 天试用期内均可使用。试用期结束后可按申请获得许可证密钥,自动签发,且密钥可按用户启用或限制单项功能。申请许可证 →
当测试是 AI 写的
面对生成的测试套件,覆盖率能做什么
概览给出的是一般性的论证。这里把它对照功能列表本身,因为生成的测试套件失败的形状是固定的 —— 每一行都被触及,一半的判定从未走到,还有几个函数只出现在测试标题里、从未真正被调用 —— 而下面这五项正是让这种形状显形的东西。
- 分支与 MC/DC 覆盖率,配合逐分支、逐判定的悬停信息,把这一行执行过和这个判定被走到过区分开。只走顺利路径的测试套件在行上接近 100%,在分支上接近 50%,而这个落差正是要找的东西。测试全绿时它一点也不显现。
- 综合评分用的是调和平均,强指标因此无法掩盖弱指标 —— 这正是生成的测试套件需要的算法。把行的数字和分支的数字做算术平均,只会埋掉唯一值得看的那个数。
- 死代码警告会为任何有可测量行、覆盖率却为零的函数在 Problems 面板中立一条记录。一个在测试标题里点了函数名却从不真正走到它的套件,在别处不会失败。
- 差异覆盖率以 git 基准 ref 为参照,把上述一切收窄到刚刚改动的那些行 —— 你今天下午接受的代码,而不是仓库的终身平均值;照着终身平均值看,一个庞大的既有套件会一直显得很健康。
- Copy Uncovered Lines 精确输出从未运行过的部分,格式是 Markdown —— 正好可以直接粘回当初写出这套测试的那个助手。
这里没有任何一项会去读一个测试并评判它的好坏,上面的话也都不应被当作这种主张:一个完全没有断言的测试,照样覆盖它触及的每一行。这些东西测量的,是评审者无法记在脑子里的那部分 —— 哪些代码从未被执行。
本扩展独有
你的行覆盖率显示 100%。而你的二进制文件中有 312 字节从未执行过。
这里的其他每一项指标都是从源代码测得的:给代码插桩,运行插桩后的构建,统计触发了什么。目标代码覆盖率测量的是任何基于源码的工具都无法触及的东西——构建出的二进制文件究竟有多少真正执行过,以指令字节计,靠观测指令流实现。编译器会产出源码中任何一行都无法交代的代码:数组边界检查、switch 跳转表、寄存器溢出、用于除法或浮点的运行时辅助例程。这些都不会出现在你的源码里,因此任何基于源码的工具——包括本扩展所读取的其他每一项指标——都无法告诉你它是否执行过。它也是这里唯一能回答这覆盖到汇编了吗?的指标,因为手写汇编从不被插桩。
DO-178C 明确指出了这一点:在 A 级,除 MC/DC 外还要求它。没有其他任何 VS Code 扩展能读取它。如何从嵌入式目标获取它 →
功能
核心功能
- 一个列出每个已测量文件的 Coverage 视图、概览标尺和 Annotated Source;在编辑器自身的装订线中,默认只显示值得标记的内容——MC/DC 条、自上次运行以来的三角形、已编辑行的圆点——仅未覆盖行的条或命中次数热力图只需一个设置即可开启。
- 根据跟踪文件所提供的内容,按行显示语句、分支、函数、区域、MC/DC 和 C++ 实例化覆盖率。
- 多格式接入以及多次运行的确定性合并,并记录来源信息。
- 路径重映射 —— CI 构建机路径 → 您的本地工作区。
- 差异覆盖率 —— 仅对相对于 git 基准引用发生更改的行进行装饰。
- Explorer 徽章以及基于综合评分着色的全局状态栏项。
- watch 模式 —— 跟踪文件发生变化时自动重新加载。
- Run Tests with Coverage——从工作区根目录识别测试运行器并开启覆盖率运行,加载其写出的内容。
- 远程跟踪文件——
coverageFile.paths条目可以是一个https://URL:CI 工件会被条件式抓取(ETag / Last-Modified),带上您在remote.headers中配置的标头,像本地文件一样加载,并按remote.refreshMinutes定时重新抓取;抓取失败时改为加载上次下载的副本。 - 路径中的变量——所有路径设置都支持
${workspaceFolder}、${workspaceFolderBasename}、${userHome}、${env:NAME}、${command:id}和${config:section.key};未知变量会原样保留,因此拼写错误会出现在发现日志中,而不是凭空消失。 - 多根工作区——每个文件夹都从自己的设置(其
.vscode/settings.json或.code-workspace条目)进行发现,其跟踪文件合并为一次运行,Coverage 视图按文件夹对文件分组,添加或移除文件夹会自动重新加载覆盖率。 - 又两个重新加载触发条件——工作区之外的绝对
coverageFile.paths条目会被轮询,因此出现在那里的文件会被加载;watch.reloadAfterTasks可指定任务(npm: test),它们结束时重新加载覆盖率,无论 watch 模式是否开启。 - 可取消的进度——加载十个或更多跟踪文件,或总量达到 8 MB 或更多,以及每次 Generate Full HTML Report,都在带 Cancel 按钮的进度通知下运行;取消后上一次运行保持加载。
- VS Code 自己的 Test Coverage 视图——每次加载也会通过编辑器的 Test Coverage API 发布(
testCoverage.publish),因此 Test Explorer 的覆盖率面板、Explorer 的逐文件百分比和编辑器自己的 Show Inline Coverage 开关显示相同的数字;Show in Test Coverage View 按请求发布并打开面板。测试带有名称时(lcov 的TN:),该视图可按测试筛选文件的覆盖率。 - 建议的重映射规则——当一次加载留下未匹配的文件(容器或 CI 路径对本地检出)时,扩展会推断出能解释其中最多文件的
pathRemap规则,在加载结果中提供 Apply Suggested Remap,在命令面板中提供 Suggest Path Remap Rule;不点击就不会写入任何内容。 - 忽略 glob——
fuciniCoverage.ignore(vendor/**、**/*.generated.ts)在加载时把整个文件从运行中丢弃,因此所有视图、门控和导出都在不含它们的情况下计数;加载结果说明有多少个,输出列出每一个。 - 未测量与未覆盖——没有任何测试加载过的文件不会在您背后被计为 0%;状态栏对这样的文件显示 not measured,
unmeasured.mode可在 Coverage 视图中列出这类文件,或把每一个计为一个未覆盖文件,并用threshold.unmeasuredFiles按数量设门。 - 合并做了什么,一目了然 — 加载多个跟踪文件时,每个文件行都注明其数值来自哪个报告,数值覆盖了旧报告的地方徽章会带边框,每个跟踪文件行统计它有多少文件被覆盖或覆盖了其他文件,点击跟踪文件行会在树中高亮它的文件(
coverageView.mergedMarks)。
综合评分与合规性
跨行、分支、函数、区域、MC/DC 和实例化的单一加权调和平均值。由于是调和平均值,薄弱指标无法被完美指标所掩盖。权重默认与 IEC 61508 / ISO 26262 / DO-178C 等级对齐,COMPLIANT / NON-COMPLIANT 判定由每个指标的阈值加上可配置的模式共同决定。
Screenshot pending — add assets/img/statusbar.png (see SCREENSHOTS.md).编辑器内分析
- 函数 CodeLens —— 每个函数的覆盖率百分比,点击可跳转至其第一处未覆盖行。
- 分支与 MC/DC 悬停 —— 每个分支的已执行/未执行次数以及每个判定的条件/向量分解;可选的彩色 MC/DC 边距装订线。
- 死代码警告 —— 对具有可测量行且覆盖率为零的函数,在 Problems 面板中发出警告。
- Next/Previous Uncovered 导航。
- 不匹配警告:当文件内容不再符合其运行结果时——随着文件保存或在磁盘上更改而保持最新,悬停显示确切差异。
- 自上次运行以来——上次运行执行过而本次未执行的每一行显示红色三角形,相反情况显示绿色三角形,附带概览标尺和悬停命中次数。
- 已编辑的缓冲区——所有标记、悬停和 CodeLens 随编辑与文本一起移动,并从重写的行上撤回,那里的灰点说明原因。
- 编辑器装订线模式——
editorGutter.mode让装订线只显示发现项(off)、在每一条从未执行的行上放一个条并在分支臂从未走到之处放一个琥珀色条(uncovered),或再给每一条执行过的行加上暖色调,运行次数越多越热(heatmap);Choose Editor Gutter Mode... 可从命令面板或状态栏菜单切换。 - 行内命中次数——
hitCounts.inline在每一条有语句开始的行后写上×12,也包括×0;Toggle Inline Hit Counts 用于切换。 - 逐行的 Problems 条目——
problems.perLine在已打开文档中每一段从未执行的行上放一条 Information 诊断(一个死函数是一条,而不是四十条),并可选地在每一条有分支臂从未走到的行上放一条;条目随您的编辑跟着行移动。 - 行着色与滚动条分布图 —
lineHighlight在行本身背后加半透明底色,替代(或补充)装订线上的标记;overviewRuler单独决定滚动条上的条纹:关闭装订线时,那就是该文件的空白分布图,而代码旁边什么都没有。 - 这一行是哪个跟踪文件覆盖的 — 合并了多个报告时,执行次数的悬停提示会列出覆盖该行的每一个报告(包括 lcov
TN:中的套件名),点击 Coverage 视图里的跟踪文件行则会点亮它贡献的那些行。
- 红、琥珀、绿——
editorGutter.mode和lineHighlight的coverage模式以色阶的颜色绘制每一条已测量的行;状态栏的模式按钮和Alt+G可从一个模式切换到下一个。 - 您的颜色,即选即预览——色阶和热力图的色调(
heatmap.colors、heatmap.colorsDark)都是设置项,设置页面会在您选色的同时在浅色和深色编辑器上预览它们。 - 文件来自哪个报告——当两个报告测量同一份代码时,由
coverageFile.sources规则或 Choose Coverage Source for This File... 决定每个文件显示哪一个,而不是让最新的获胜。
报告与历史记录
- Generate Full HTML Report —— 按目录自行生成的多页报告;Open Annotated Source 用于单个文件。
- 可选的本地运行历史记录,附带覆盖率趋势(▲/▼),以及 Compare Two History Runs 和 Compare with Last Run。
- Show Worst-Covered Files / Functions 和 Copy Uncovered Lines(Markdown)。
- Export Fucini JSON —— 完整的规范化模型。
- Export Coverage Report... — 将同一次运行导出为 CSV(按文件或按函数)、Markdown 摘要、LCOV 跟踪文件、Cobertura XML、SARIF,或自包含 SVG 徽章。凭二十五个读取器和这些写入器,扩展可在格式之间转换:加载 JaCoCo 或 llvm-cov JSON,输出 Codecov、Coveralls 和 SonarQube 读取的 LCOV,或 Jenkins、GitLab 和 Azure DevOps 采集的 Cobertura XML。
- Generate Coverage Badge——直接写入工作区的 shields 风格 SVG(
badge.outputPath,默认coverage-badge.svg),README 用嵌入即可,不需要托管服务;badge.metric选择行、分支、MC/DC 或综合评分,颜色遵循colorScale.*的档位,badge.autoUpdate在每次加载后重写它。
Screenshot pending — add assets/img/report.png (see SCREENSHOTS.md).
Screenshot pending — add assets/img/annotated-source.png (see SCREENSHOTS.md).Community 与 Pro,逐项对比
两个列表项,一套代码。Community 是永久免费的层级,也是 Pro 列表项在 14 天试用结束后落入的层级;Pro 和试用则包含全部功能,不设上限。分界线的划法保证免费层级始终能看到每一项发现,只为便利、证据和规模付费——在 VS Code 中,Fucini Coverage: What Community Includes 会显示同一份清单以及每项上限的当日计数。
| 能力 | Community(免费) | Pro 与试用 |
|---|---|---|
| 全部 25 种格式、多文件合并、路径重映射 | ✓ | ✓ |
| 行槽、概览标尺、资源管理器徽章、“覆盖率”视图、CodeLens、悬停 | ✓ | ✓ |
| 带自动重新加载的监视模式;Run Tests with Coverage | ✓ | ✓ |
| 差异覆盖率、历史与趋势、“自上次运行”标记 | ✓ | ✓ |
| 通过命令加载覆盖率 | 每天 25 次(自动加载不计) | 不限 |
| 比较运行、Check Coverage Thresholds、Open HTML Report、Export Coverage Report、Export Fucini JSON | 各每周 5 次 | 不限 |
| Annotated Source(原位) | 每周 5 次 | 不限,另有常驻侧边窗格和 Generate Full HTML Report |
| Export Coverage Report | CSV(按文件、按函数) | 另有 Markdown、LCOV、Cobertura XML、SARIF、SVG 徽章 |
| 不再与其覆盖率匹配的文件 | 报告并变暗 | 另加证明这一点的行、函数或校验和 |
| 存活变异体 | 在行上标记,并显示数量 | 另可查看每个变异体改动了什么 |
| 执行了某一行的测试 | 数量 | 另可查看测试名称 |
| CRAP | 本次运行的 Max CRAP,以及每个函数的 CRAP | 另有排序后的 Riskiest Methods 列表 |
| Risk hotspots | 数量,以及最差分数 | 另有排序后的列表,每一项打开其函数 |
| MC/DC 覆盖率、行槽条和悬停 | — | ✓ |
| 目标代码覆盖率评分与门控 | 仅告知其存在 | ✓ |
| 被多个报告测量的文件 | 最新的报告 | 还可以按文件选择其中一个,或将它们合并(agree / union) |
| 是否需要遥测 | 否——可选地,且每台机器仅限一次,Unlock Full Features 用详细的使用遥测换取右列全部功能 30 天 | 否 |
一周是指从开启它的第一次使用起的七天,仅读取覆盖率的操作一概不计数。还没准备好订阅?7 天通行证让您在一周内使用右侧一列的全部功能,一次付费,无需取消。
VS Code 与 Visual Studio 并排比较
一个产品,两个编辑器,一个读取器:同一份报告在两者中给出的数字精确到每一位都相同。Coverage Studio for Visual Studio 运行于 Visual Studio 2022 和 2026 —— Community、Professional 和 Enterprise,且不使用 Visual Studio 自带的代码覆盖率(在 2022 中仅限 Enterprise);所有付费套餐均包含,装有两个编辑器的一台设备算一个席位。线上方的功能两者都有;线下方是 Visual Studio 没有对应物的功能,以及尚待推出的功能。
| 功能 | VS Code | Visual Studio |
|---|---|---|
全部 25 种格式、多文件合并、路径重映射、相同的 fuciniCoverage.* 设置和 .vscode/settings.json | ✓ | ✓ |
| 装订线、概览标尺、命中计数、逐函数镜头、悬停提示、Coverage 视图、状态栏及其卡片 | ✓ | ✓ |
| 带自动重载的监视模式;Next Uncovered、Next Partly-Tested Decision;复制为 Markdown | ✓ | ✓ |
| 综合得分、阈值和 COMPLIANT 判定;MC/DC;CRAP | ✓ | ✓ |
| Getting Started,18 种语言 | 演练 | Tools → Coverage Studio 下的页面 |
| Run Tests with Coverage、Run This Test with Coverage、每次保存后的覆盖率;编辑器自带的 Test Coverage 面板 | ✓ | ✓,以及 Collect Coverage in Test Explorer… — Test Coverage 面板是 VS Code API |
| 资源管理器徽章 | ✓ | —(解决方案资源管理器无法装饰文件) |
| Annotated Source、HTML 报告、导出、Check Thresholds、Error List、历史与趋势、差异覆盖率 | ✓ | ✓ |
| 哪些测试运行了某一行、从树和编辑器中排除、命名空间视角与搜索框、覆盖率会话、趋势图、CI 基线 | ✓ | ✓,另有面向 C++ 项目的 Run Native Project with Coverage |
| 免费层级、试用、结账 | ✓ | —(付费套餐;在已激活 VS Code 的机器上可找到密钥) |
接下来:所有这些覆盖率都将进入 Azure DevOps,以免费扩展的形式。 Azure DevOps 在构建上显示覆盖率,但仅限于其自身格式所及 —— 行,以及以百分比表示的分支。Fucini DevOps Studio 将显示 Coverage Studio 读取的全部内容:这 25 种格式中的每一种,适用于每种语言,带有 MC/DC、条件、综合分数和门槛,作为生成它的流水线上的 Coverage 选项卡。请关注新闻以获知首个版本的发布。
设置参考
在设置界面中配置(搜索 Fucini Coverage)或在 settings.json 中配置。
Download the complete settings reference — a commented settings.json holding every fuciniCoverage.* setting at the same default the packaged extension uses, ready to copy into your workspace or user settings. Regenerated from the extension on every release, so it cannot drift from what the VSIX ships.
以 按文件夹。 结尾的行在多根工作区中接受文件夹级别的值:每个文件夹用自己的 .vscode/settings.json 或 .code-workspace 条目进行发现,其中的 ${workspaceFolder} 指该文件夹。
本地化
| 设置 | 默认值 | 作用 |
|---|---|---|
language | auto | 将本扩展自身的运行时界面(状态栏、通知、工具提示、许可证与报告 Webview)固定为某种语言,与 VS Code 的整体显示语言无关。auto 跟随 VS Code。取值之一:auto, en, uk, nl, de, fr, es, hr, pl, it, pt, ru, tr, he, ja, zh, hi, ko, ar。不会改变命令面板条目或设置界面自身的标签/说明 —— 那些由 VS Code 依据其显示语言解析。 |
发现与加载
| 设置 | 默认值 | 作用 |
|---|---|---|
coverageFile.defaultLocation | "" | 发现与文件选择对话框的基准文件夹。变量:${workspaceFolder}、${workspaceFolderBasename}、${userHome}、${env:NAME}、${command:id}、${config:section.key}。按文件夹。 |
coverageFile.paths | [] | 要加载并合并的追踪文件,相对于基准文件夹、绝对路径(变量同上),或在每次加载时抓取的 http(s):// URL——当 URL 本身没有扩展名时,请把 #lcov.info(或其他文件名)作为 URL 片段加上。相对的 * glob 会在基准文件夹下递归查找;绝对路径的条目也可以含通配符(${workspaceFolder}/build/coverage-merged/*.lcov.info,** 表示任意深度),在其之前的文件夹下搜索。按文件夹。 |
watch.enabled | true | 当追踪文件变化时重新加载覆盖率——对于工作区之外的绝对条目,文件出现时也会重新加载。按文件夹。 |
watch.reloadAfterTasks | [] | 任务名(label,或像 npm: test 这样的 source: name),它们结束时重新加载覆盖率,无论 watch.enabled 是否开启。按文件夹。 |
remote.headers | [] | 随每次 URL 抓取发送的 Name: value 标头;变量会被展开,因此 Authorization: Bearer ${env:CI_TOKEN} 让令牌不必写进 settings.json。按文件夹。 |
remote.refreshMinutes | 0 | 每 N 分钟重新抓取 URL 条目(条件式 GET;0 = 仅在加载时)。按文件夹。 |
baseline.report | "" | 用来比对每一次加载的运行的报告 —— 主分支的那份,由构建服务器发布:一个 URL,用 remote.headers 获取并像 coverageFile.paths 的 URL 一样缓存,或者一个已下载工件的路径,绝对路径或相对于文件夹的路径。状态栏的卡片随后会说明本次运行相对于它处于何处,Compare with CI Baseline 则列出变动的文件。留空:没有基线。按文件夹。 |
色阶与徽章
| 设置 | 默认值 | 作用 |
|---|---|---|
colorScale.preset | default | colorblind 在所有为覆盖率着色的地方,将红、琥珀和绿替换为朱红、橙色和蓝色(Okabe–Ito);您在下方修改过的颜色优先。 |
colorScale.lowColor | #8b1a1a | 覆盖率渐变的低端。 |
colorScale.midColor | #b8860b | 渐变的枢轴颜色。 |
colorScale.highColor | #228b22 | 渐变的高端(100%)。 |
colorScale.lowThreshold | 80 | 徽章由低档变为中档的百分比。 |
colorScale.highThreshold | 90 | 徽章由中档变为高档的百分比(同时是渐变枢轴)。 |
heatmap.colors | ["#fff1a8", …, "#a63603"] | 浅色主题下热力图的五级色调,从运行次数最少的行到运行次数最多的行。 |
heatmap.colorsDark | ["#6e5f22", …, "#ff6a00"] | 深色主题下的同样设置,越亮表示次数越多。 |
综合评分(加权调和平均值)
| 设置 | 默认值 | 作用 |
|---|---|---|
whmWeights.lines | 1 | 行/语句覆盖率的权重。 |
whmWeights.functions | 1 | 函数覆盖率的权重。 |
whmWeights.regions | 1.5 | 区域覆盖率的权重(llvm-cov)。 |
whmWeights.branches | 2 | 分支覆盖率的权重。 |
whmWeights.mcdc | 4 | MC/DC 覆盖率的权重。0 表示排除。 |
whmWeights.instantiations | 0.5 | C++ 模板实例化的权重(llvm-cov)。 |
阈值与合规性
| 设置 | 默认值 | 作用 |
|---|---|---|
threshold.profile | standard | standard 采用下面列出的默认值;safety 将除变异得分以外的每个门控都设为 100;custom 保留您已经设置的值。在默认配置文件下,安全相关指标不设门控——未测量 MC/DC 的项目不会因此被判为不合格。 |
threshold.statement | 80 | 语句覆盖率最低百分比。0 停用该检查。 |
threshold.branch | 70 | 分支覆盖率最低百分比。 |
threshold.mcdc | 0 | MC/DC 最低百分比。 |
threshold.functions | 80 | 函数覆盖率最低百分比。 |
threshold.regions | 75 | 区域覆盖率最低百分比(llvm-cov)。 |
threshold.instantiations | 0 | 实例化最低百分比(llvm-cov);纯 C 项目会被跳过。 |
threshold.conditions | 0 | 条件覆盖率最低百分比。 |
threshold.functionCalls | 0 | 函数调用覆盖率最低百分比,以报告中提供该数据为限。 |
threshold.objectCode | 0 | 目标代码覆盖率最低百分比,以报告中提供该数据为限。 |
threshold.mutation | 0 | 最低变异得分,以已加载变异报告为限。 |
threshold.weighted | 75 | 最低综合评分。 |
compliance.mode | strict | strict | whm | both | either. |
compliance.diagnostics | false | 每个未达标阈值在“问题”中一条错误,挂在跟踪文件上。 |
threshold.unmeasuredFiles | -1 | 未测量文件的最大数量(需要将 unmeasured.mode 设为 list 或 count)。-1 不检查;0 在第一个没有任何测试加载过的文件上即失败。 |
problems.perLine | off | off | uncovered | uncoveredAndPartial:在每个已打开的文档中,为每一段连续未覆盖的行给出一条 Information 条目(编辑器中显示为波浪线),可选地再为每一条有分支臂从未走到的行各给一条。独立于 problems.enabled。按文件夹。 |
差异、重映射与报告
| 设置 | 默认值 | 作用 |
|---|---|---|
pathRemap | [] | 有序的 {from,to} 路径重写;to 可使用 ${workspaceRoot},它会先尝试追踪文件自己所在的文件夹,然后再尝试工作区的其他每个文件夹。当一次加载留下未匹配的文件时,加载结果会提供 Apply Suggested Remap,附带从未匹配路径推断出的规则(命令面板中也有 Suggest Path Remap Rule);不点击就不会写入任何内容。按文件夹。 |
ignore | [] | 要从运行中整体剔除的文件的 glob 模式(vendor/**、**/*.generated.ts、build/**)——在加载时丢弃,因此所有视图、门控和导出都在不含它们的情况下计数。同时匹配相对于工作区的路径和绝对路径;不含 / 的模式匹配任意深度的名称,与 .gitignore 一样。按文件夹。 |
ignore.generated | true | 把生成的 .NET 文件 —— *.Designer.cs、*.g.cs、*.g.i.cs、*.generated.cs、*.razor.g.cs、*.AssemblyInfo.cs、GlobalUsings.g.cs、Migrations/** 和 obj/** —— 在应用 ignore 之前就排除在每个总计、页面和导出之外。测试其迁移的项目请关闭。按文件夹。 |
ignore.namespaces | [] | 对 .NET 源代码,要排除在每个总计和每个页面之外的命名空间:命名空间声明匹配其中之一的文件不计入。以 * 为通配符的前缀 —— Acme.Generated、Acme.*.Migrations、*Tests。按文件夹。 |
ignore.attributes | ["ExcludeFromCodeCoverage"] | 从源代码中读取、把 .NET 类、方法或属性排除在统计之外的特性:位于其中之一下方的成员会像被 LCOV_EXCL_START/STOP 排除那样被排除,无论报告是哪个工具写的。名称带或不带 Attribute 后缀、带或不带命名空间均可;可以加上 GeneratedCode、Obsolete 或你自己的。按文件夹。 |
testRun.perTest | false | Run Tests with Coverage 把一个 dotnet test 配方按测试类逐个运行,并给每份报告标上其类名,这样悬停、CodeLens 和 Show Tests That Ran This Line 就能说出哪些测试运行了某一行 —— 更慢,且只用于 .NET,因为它的 Cobertura 报告自己说不出来。按文件夹。 |
testRun.onSave | false | 保存一个源文件后,片刻之后就会开启覆盖率运行覆盖它的测试:对 .NET 解决方案,只运行引用了被保存文件所在项目的测试项目,每个一次 dotnet test;其他任何运行器则运行其整个配方。连续多次保存算作一次运行;正在进行的运行不会被打断。按文件夹。 |
testRun.skipWhenTestsFail | false | Run Tests with Coverage 在运行器以失败退出时让覆盖率保持原样留在屏幕上,并在 Output 窗格中说明 —— 一次红色的运行不会把绿色的文件涂成红色。按文件夹。 |
unmeasured.mode | off | off | list | count:对于运行所属种类中没有任何测试加载过的工作区文件该怎么做(参见未测量与未覆盖)。list 在 Coverage 视图和加载结果中列出它们;count 还会把每一个按其代码行数计为一个未覆盖文件。更改后会重新加载。 |
unmeasured.exclude | ["**/*.h", "**/*.hpp", "**/*.hh", "**/*.inl", "**/*.d.ts"] | 永远不被称为未测量的文件,采用 ignore 的 glob 语法——默认为仅含头文件和仅含声明的文件。按文件夹。 |
hotspots.crapThreshold | 30 | CRAP 分数达到或超过此值的函数是风险热点,列在 Coverage 视图的树下方,最差的在前 —— 30 是该指标的提出者所建议的数值。只有携带圈复杂度的报告才会有热点。按文件夹。 |
hotspots.complexityThreshold | 0 | 复杂度达到或超过此值的函数同样是热点,无论其覆盖率如何;0 表示关闭。按文件夹。 |
gitDiff.enabled | false | 仅统计相对基准引用发生变更的行。按文件夹。 |
gitDiff.baseRef | origin/master | 差异覆盖率使用的 Git 基准引用。按文件夹。 |
externalHtmlReport.dir | "" | 为 Annotated Source 读取已生成的 llvm-cov show HTML 目录。按文件夹。 |
htmlReport.outputDir | "" | Generate Full HTML Report 的输出目录。按文件夹。 |
badge.outputPath | coverage-badge.svg | Generate Coverage Badge 写出 SVG 的位置——相对于工作区文件夹或绝对路径,变量与 coverageFile.defaultLocation 相同;父文件夹会被创建。按文件夹。 |
badge.metric | lines | lines | branches | mcdc | weighted:徽章上显示的整次运行的数字(weighted 是状态栏的综合评分)。没有对应数据时 → 灰色的 n/a。按文件夹。 |
badge.autoUpdate | false | 每次成功加载后静默重写徽章(记录为 [FUCINI_BADGE])。按文件夹。 |
显示与分析
| 设置 | 默认值 | 作用 |
|---|---|---|
mcdcGutter.enabled | false | 彩色 MC/DC 边槽。 |
statusBar.enabled | true | 显示整次运行及单个文件的状态栏项。 |
statusBar.showLauncher | true | 始终可用的快捷菜单入口。 |
statusBar.showModeToggle | true | 状态栏上显示装订线模式名称的按钮;点击一次即切换到下一个模式。 |
codeLens.enabled | true | 按函数显示的覆盖率 CodeLens。 |
deadCode.enabled | true | 对零覆盖率函数发出警告。 |
staleWarning.enabled | true | 标记内容不再与其运行结果匹配的文件。 |
explorerBadges.enabled | false | 资源管理器中文件旁的覆盖率徽章和悬停提示。 |
coverageFile.rememberPicks | true | 将每个选中的文件写入 coverageFile.paths。 |
coverageFile.sources | [] | 当多个报告测量同一文件时,该文件的数值来自哪个已加载的报告:按顺序排列的 { "files": glob, "report": glob } 规则,第一条匹配的规则说了算。使用 "combine": "union"(任一报告运行过的行即为已覆盖)或 "agree"(仅当每个报告都运行过,不一致之处以青绿色标记)时,匹配的报告会被合并。付费套餐。按文件夹。 |
coverageFile.mergeStrategy | newest | 对于没有规则决定的文件:newest(最后写入的报告获胜)或 order(coverageFile.paths 中靠后的条目获胜,无论时间如何)。按文件夹。 |
sinceLastRun.enabled | true | 自上次运行以来覆盖率发生变化的行的行槽标记。 |
dirtyMarks.enabled | true | 自运行加载以来被编辑的行的灰色行槽点。 |
editorGutter.mode | off | off | uncovered | coverage | heatmap:除上述发现项外不显示任何内容、仅在未覆盖(及部分覆盖)的行上显示条、在此之上再给每一条已覆盖的行加上绿色条,或在此之上再按命中次数给每一条执行过的行加上暖色调。按文件夹。 |
lineHighlight | off | off | uncovered | coverage | heatmap:按装订线标记的内容,在行本身背后加半透明底色。独立设置,因此可以让装订线保持干净而只给空白着色,或者反过来。按文件夹。 |
overviewRuler | follow | follow | uncovered | off:未覆盖的行是否在滚动条的概览标尺上留下条纹。uncovered 即使装订线关闭也会绘制——代码旁边什么都没有,只在滚动条上得到该文件的空白分布图;off 保留条形、去掉条纹。按文件夹。 |
hitCounts.inline | false | 在每一条有语句开始的行后显示 ×N,包括 ×0。按文件夹。 |
testCoverage.publish | true | 将每次加载的运行发布到 VS Code 自己的 Test Coverage 视图(Test Explorer 面板、Explorer 百分比、Show Inline Coverage)。关闭时:Test Explorer 中不会出现 Fucini Coverage 条目;Show in Test Coverage View 仍可按请求发布。 |
coverageView.perspective | folders | Coverage 视图显示哪棵树:工作区的文件夹和文件,或者 —— 对于写明其类名的 .NET 报告(Cobertura、Coverlet、OpenCover)—— 命名空间、类和方法,各有自己的数字。视图中的下拉框写入此设置;只有当运行携带类名时才会提供它。 |
coverageView.mergedMarks | true | 加载多个跟踪文件时:为数值覆盖了旧报告的每个文件的跟踪文件徽章加边框,并允许点击跟踪文件行来高亮它所测量的文件。关闭:普通徽章,无高亮;跟踪文件行仍会统计被覆盖的数量。 |
excludeComments | true | 排除注释/空行 & LCOV_EXCL_* 行,以及 C、C++、Objective-C、CUDA 和 C# 中的预处理指令。 |
excluded.includeInTotals | false | 将被排除的行计入总数。 |
历史记录
| 设置 | 默认值 | 作用 |
|---|---|---|
history.enabled | false | 在本地保存运行记录以便查看趋势与比较。 |
history.retention | 20 | 最多保留的运行记录数。 |
状态栏快捷操作
除最后两项外,所有选项默认均为 false;启用后可将相应操作添加到快捷菜单:quickActions.compareWithLastRun、openAnnotatedSource、openAnnotatedSourceToSide、toggleAnnotatedSource、toggleWatch、worstCoveredFiles, worstCoveredFolders、worstCoveredFunctions、nextUncovered、previousUncovered、checkThresholds、copyUncoveredLines、compareHistoryRuns、exportJson、exportReport、generateBadge、showTestCoverage、chooseGutterMode、toggleInlineHitCounts。
遥测
| 设置 | 默认值 | 作用 |
|---|---|---|
telemetry.enabled | false | 使用情况遥测, 默认关闭。在 Community 层级,Unlock Full Features 以它换取全部 Pro 功能(含 MC/DC),为期 30 天,每台机器一次;付费许可证不受影响。发送的内容请参阅隐私政策。每日摘要和移除通知同时还受 VS Code 自身的 telemetry.telemetryLevel 限制;安装通知和少量小事件则不受限制。 |
更新
| 设置 | 默认值 | 作用 |
|---|---|---|
update.checkForUpdates | true | 定期检查 fucini.software 与 VS Code Marketplace 是否有更新版本,并提示安装其中较新的一个。 |
许可
| 设置 | 默认值 | 作用 |
|---|---|---|
license.key | "" | 评估预发布版的激活密钥(形如 FCK1.… 的字符串)。绑定到本机/用户;可能带有有效期和按功能的限制。参见评估与激活。 |