从 Visual Studio Market Place(相对于 2019)、Visual Studio Market Place(相对于 2022)下载此扩展或从版本下载。可以从这里获取旧版本。
对于 .Net - 测试适配器是 nuget 包。例如,NUnit 测试适配器扩展还不够。
Fine Code Coverage 使用 3 种不同的覆盖工具之一提供代码覆盖率。在以前的版本中,使用了两种覆盖工具:OpenCover 和 Coverlet,它们将被称为“旧覆盖”。
Microsoft 现在提供免费的覆盖率解决方案,您可以通过设置 Visual Studio Fine Code Coverage 枚举选项 RunMsCodeCoverage 来选择使用该解决方案。这可能是大多数开发人员的首选覆盖工具。目前它处于测试阶段。
通过旧的覆盖范围,FCC 可以提供每个工具的排除/包含选项的抽象。这种抽象不适用于 MS 代码覆盖率。
因此,您会发现女士覆盖率与旧覆盖率有单独的配置选项以及两者通用的选项。可以实现程序集级别的排除和包含 - 请参阅 ExcludeAssemblies 和 IncludeAssemblies。配置(主要)由 Visual Studio 选项、finecodecoverage-settings.xml 文件和项目 msbuild 属性决定。所有这些设置都是可选的。对于具有项目范围的选项,这些设置形成一个层次结构,其中较低级别覆盖,或者对于集合,覆盖或与上面的级别合并。这将在后面进一步详细描述。
无论使用哪种覆盖工具,该过程都从 FCC 对 Visual Studio 中的测试资源管理器做出反应开始。 3 个覆盖率工具之一提供覆盖率结果,并且可以通过精细代码覆盖率工具窗口上的按钮打开结果。此覆盖率不是动态的,表示从上次执行测试时获得的覆盖率。当覆盖范围过时时,您可以单击“工具”中的“FCC Clear UI”按钮或再次运行覆盖范围。
有关 FCC 在代码覆盖方面进展情况的详细信息,请参阅精细代码覆盖工具窗口中的覆盖日志选项卡,并在 FCC 输出窗口窗格中找到更详细的日志。如果您遇到问题,那么提供输出窗口中的日志将有助于了解问题的本质。
在精细代码覆盖率工具窗口中呈现单个统一报告。该报告显示了线路和分支机构的覆盖范围以及风险热点,并具有打开班级文件的功能。
彩色边距指示代码的覆盖状态。已检测(包含且可分析)的代码行要么被覆盖、未被覆盖或部分被覆盖,这意味着并非所有分支都被执行。
FCC 提供了脏区的概念,一旦您更改了代码,以前检测的代码将不再显示检测状态。
对于 C# 和 Visual Basic 提供了进一步的覆盖信息:
FCC 还允许您查看未包含在覆盖范围内的代码以及自上次覆盖范围运行以来添加的新行。
脏线和新线着色都需要在选项中打开。
如果需要,也可以通过设置可用的 Visual Studio 选项来突出显示线条。请继续阅读以了解更多详细信息。
颜色可以通过 Visual Studio / Tools / Options / Environment / Fonts and Colors / Text Editor / Display Items 进行控制:
对于 Visual Studio Community、Professional 和 Enterprise,您可以使用以下设置
覆盖范围 接触区域 FCC
覆盖部分接触区域 FCC
覆盖范围 未触及区域 FCC
覆盖脏区 FCC
覆盖范围 新线路 区域 FCC
覆盖范围不包括的区域 FCC
对于提供以下项目的版本,FCC 将默认使用这些项目而不是等效的 FCC 项目,以便可以使用主题中定义的颜色。如果您希望 5 个可用项目保持一致,可以将 UseEnterpriseFontsAndColors 设置为 false。
覆盖未触及区域
覆盖部分接触区域
覆盖范围
您可以通过将 Visual Studio 选项 EditorCoverageColouringMode 设置为 Off 来关闭编辑器着色。如果存在性能问题,您还可以将该选项设置为 DoNotUseRoslynWhenTextChanges。这样做的话,新的线条着色将不会那么好。如果您切换到 EditorCoverageColouringMode 选项之一,那么您将需要重新运行覆盖率。
您可以切换编辑器颜色。 FCC 在“工具”菜单中添加了一个菜单按钮“切换指示器”。您还可以创建键盘快捷键 - 工具/选项/环境/键盘,显示包含“ToggleIndicators”的命令。
对于具有 @code 块的 Blazor 组件,可以在这些区域之外生成覆盖线。当 Roslyn 语法树可供 FCC 使用时,您可以将选项 BlazorCoverageLinesFromGeneeratedSource 设置为 true,以将 .razor 文件中的覆盖行限制为生成源中的覆盖行。
FCC 跟踪 Visual Studio 编辑器并在文件关闭时保存此信息。如果重新打开文件时,文本在文档窗口之外发生了更改,则该文件将没有覆盖标记,因为覆盖行不再是正确的。
如果您在 FCC 收集报道期间编辑文件,也不会出现编辑标记。
对于旧的覆盖范围,FCC 需要复制您的测试 dll 和依赖项,并在这些文件上运行 OpenCover 或 Coverlet。对于 ms 代码覆盖率来说,这不是必需的。旧的覆盖率将等到测试完成后再启动覆盖率工具重新运行所有测试。对于 ms 代码覆盖率来说,这不是必需的。旧的覆盖范围基于每次测试。 Ms 代码覆盖率是您在测试资源管理器中选择的测试的覆盖率。
支持C++!请注意,FCC 尚未使用 C++ 项目进行正确测试,但使用简单的 C++ 类,通过 Google Test 进行测试,FCC 提供了覆盖范围。
首先,您需要将 RunMsCodeCoverage 选项从 No 更改为 No。
Ms 代码覆盖率需要一个针对代码覆盖率进行适当配置的运行设置文件。这要求您拥有 ms 代码覆盖率包,并使用 TestAdaptersPaths 元素指向它并指定 ms 数据收集器。排除和包含也在运行设置中指定。我认为文档对于其工作原理还不够清楚,因此您可能想看看这个问题。
FCC 不要求您这样做。如果您不提供运行设置并且 RunMsCodeCoverage 为“是”,则 FCC 将生成一个运行设置并将必要的条目写入项目文件中。
请注意,在运行测试时在 Visual Studio 中打开测试项目文件可能会导致 FCC 在测试结束时删除条目时出现冲突警告。如果 RunMsCodeCoverage 为 IfInRunSettings,则如果项目的运行设置包含正确配置的 ms 数据收集器元素,则 FCC 将处理收集的结果。
FCC 包含 ms 代码覆盖率包,并将为从测试资源管理器窗口运行的每个测试项目创建必要的运行设置文件。排除项和包含项将来自组合设置,其方式与旧的承保范围类似。由于 ms 代码覆盖率使用正则表达式,并且对 Coverlet 和 OpenCover 具有不同的排除/包含方法,因此存在 ms 特定的 Visual Studio 选项和关联元素。
由于 FCC 为每个测试项目提供了一个运行设置文件(如果您没有提供广泛的解决方案或特定于项目的解决方案),因此它必须在项目文件中写入 RunSettingsFilePath 元素。
尽管 FCC 从项目文件中清除了该元素的值,但它仍然存在。
FCC 使用字符串替换从模板创建运行设置。如果需要,您可以提供自己的模板。 FCC 将在项目目录或解决方案目录中查找 fcc-ms-runsettings-template.xml。您的模板必须是有效的 xml 文档,但不需要提供所有运行设置元素。如果不存在,FCC 将添加可替换的 ResultsDirectory 和 TestAdaptersPaths(以及容器 RunConfiguration 元素,如果需要)元素。如果不存在,FCC 还将添加 ms DataCollector / Configuration / CodeCoverage 可替换元素。如果未提供,它还会添加非排除/包含推荐的 CodeCoverage 元素AllowLowIntegrityProcesses、CollectFromChildProcesses、CollectAspDotNet 和 UseVerifyingInstrumentation。对于 .Net Framework,UseVerABLEInstrumentation 将为 false。要查看生成的运行设置,请使用项目文件中的 RunSettingsFilePath 元素。
对于提供自己的元素(否则由 FCC 提供)的自定义模板,要参与模板替换,您需要添加 %fcc_replace% 类型的字符串。
排除和包含遵循格式“%fcc_modulepaths_exclude%”。为了让 FCC 向 TestAdaptersPaths 提供 fcc 提供的 ms 代码覆盖路径,请使用 %fcc_testadapter%。
也可以使用您自己的运行设置文件并将 FCC 添加到其中并替换。 FCC 将确保 TestAdaptersPaths 元素以及 ms 数据收集器均存在。与模板不同,如果存在 ms 数据收集器,则 xml 仅应用替换。
如果未提供,Ms 代码覆盖率确实提供默认的 Configuration / CodeCoverage 元素。如果不存在,它还会添加一些默认排除项,或者将它们合并到其中,除非您添加属性 mergeDefaults='false'。例如,它的属性排除 ExcludeFromCodeCoverageAttribute。如果您有兴趣,请参阅 ...AppDataLocalFineCodeCoveragemsCodeCoverage_version_buildnetstandard1.0Microsoft.VisualStudio.TraceDataCollector.dll 和 DynamicCoverageDataCollector。
请在报告问题之前检查故障排除。
Dll 被复制到项目输出文件夹的子文件夹中,这可能会影响您的测试。另一种方法是将选项 AdjacentBuildOutput 设置为 true。覆盖范围由针对旧式项目的 OpenCover 和针对新型 sdk 项目的 Coverlet 提供。尽管 FCC 提供了对两者的抽象,因此可以忽略两者之间的差异,但在某些情况下,了解将运行的覆盖工具很重要。当使用 Coverlet 时,这一点最为明显,请继续阅读详细信息。
另一种情况是当您想要使用特定版本的覆盖工具时。这是可以配置的。
FCC 使用的覆盖工具默认安装到Environment.SpecialFolder.LocalApplicationData
内的 FineCodeCoverage 目录中。这可以使用 ToolsDirectory Visual Studio 选项进行更改。确保该包含目录存在,并且重新启动后将在其中安装工具。
运行(一些)单元测试并......
层次结构如下:
a) Visual Studio 选项
b)finecodecoverage-settings.xml 文件
这些可以通过从项目目录中向上查找目录结构来找到。通过将属性 topLevel='true' 应用于根元素,步行将停止。
鉴于项目目录中的finecodecoverage-settings.xml和解决方案目录中的finecodecoverage-settings.xml,层次结构为:
Visual Studio 选项
解决方案级别finecodecoverage-settings.xml
项目级别finecodecoverage-settings.xml
<FineCodeCoverage>
<Enabled>
True
</Enabled>
<!-- and more -->
</FineCodeCoverage>
c) msbuild项目文件
有两种方式提供这些设置。直接在项目文件中
<PropertyGroup Label="FineCodeCoverage">
<Enabled>
True
</Enabled>
<Exclude>
[ThirdParty.*]*
[FourthParty]*
</Exclude>
<Include>
[*]*
</Include>
<ExcludeByFile>
**/Migrations/*
**/Hacks/*.cs
</ExcludeByFile>
<ExcludeByAttribute>
MyCustomExcludeFromCodeCoverage
</ExcludeByAttribute>
<IncludeTestAssembly>
True
</IncludeTestAssembly>
<ModulePathsExclude>
.*Fabrikam.Math.UnitTest.dll
</ModulePathsExclude>
<!-- and more -->
</PropertyGroup>
使用 FineCodeCoverage 元素。
<PropertyGroup>
<FineCodeCoverage>
<Enabled>
True
</Enabled>
<!-- and more -->
</FineCodeCoverage>
</PropertyGroup>
如果将项目设置存储在项目文件外部并使用 msbuild Import,则这是必要的。
如果您希望将设置元素与上一级的设置元素合并,那么这也是必要的,因为 msbuild 不支持自定义属性。
默认值是覆盖每个集合属性。通过在根元素上设置 defaultMerge='true' 可以更改所有设置。
如果您确实在设置元素上提供合并属性,那么它将被使用。
这不是传递性的。
<PropertyGroup>
<FCCExcludeFromCodeCoverage/>
</PropertyGroup>
<PropertyGroup>
<UseDataCollector/>
</PropertyGroup>
Coverlet有不同的“驱动因素”。 Fine Code Coverage 过去仅使用 Coverlet 控制台驱动程序。这有一些与之相关的问题。如果您遇到0% 覆盖率或覆盖率不一致,现在可以切换到数据收集器驱动程序。这是更好的驱动程序,但不能用于所有项目。目前,这是选择加入的。将来,Fine Code Coverage 将确定合适的驱动程序。请参阅封面文档以获取版本支持。
请注意,无需添加 nuget coverlet.collector 包,因为 FCC 内部提供了该包。
Fine Code Coverage 将在两种情况下使用数据收集器驱动程序:
可在此处找到 Coverlet Data Collector 设置。如果您使用上面的选项 2),则将从项目属性(上面)和全局 Visual Studio 选项(见下面)生成通用设置(排除和包含),其中项目属性优先。如果您使用选项 1),则仅在通用设置配置元素不存在且 RunSettingsOnly 选项(见下文)已更改为 false 的情况下才会使用项目和全局选项。
选项 | 描述 |
---|---|
常见的 | |
编辑器覆盖范围着色模式 | 设置为 Off,或者如果存在性能问题,则设置为 DoNotUseRoslynWhenTextChanges |
BlazorCoverageLinesFromGenelatedSource | 设置为 true 以将 .razor 文件中的覆盖行限制为生成源中的行(如果可用) |
显示编辑器覆盖范围 | 设置为 false 以禁用所有编辑器覆盖指示器 |
在字形边距中显示覆盖范围 | 设置为 false 以防止字形边距中的覆盖标记 |
显示字形边距覆盖 | 设置为 false 以防止字形边距中的标记被覆盖 |
显示 UncoveredInGlyphMargin | 设置为 false 以防止字形边距中未覆盖标记 |
显示部分覆盖在字形边距中 | 设置为 false 以防止字形边距中的部分标记被覆盖 |
显示脏字形边距 | 设置为 true 以在字形边距中显示脏标记 |
在字形边距中显示新内容 | 设置为 true 以在字形边距中显示新线标记 |
在概览中显示覆盖范围保证金 | 设置为 false 以防止概览边距中出现覆盖标记 |
显示涵盖概览保证金 | 设置为 false 以防止概览边距中的覆盖标记 |
显示概览中未发现的边际 | 设置为 false 以防止概览边距中出现未覆盖的标记 |
显示部分覆盖概览边距 | 设置为 false 以防止概述边距中部分覆盖标记 |
ShowDirtyInOverview 边距 | 设置为 true 以在概览边距中显示脏标记 |
显示新内容概述边距 | 设置为 true 以在概览边距中显示新线标记 |
显示线覆盖突出显示 | 设置为 true 以允许覆盖线突出显示 |
显示线覆盖突出显示 | 设置为 false 以防止覆盖线突出显示 |
ShowLineUncovered突出显示 | 设置为 false 以防止未覆盖的行突出显示 |
显示线部分覆盖突出显示 | 设置为 false 以防止部分覆盖的行突出显示 |
显示线脏突出显示 | 设置为 true 以显示脏线突出显示 |
ShowLine新突出显示 | 设置为 true 以显示新行突出显示 |
使用企业字体和颜色 | 设置为 false 以使用 FCC 字体和颜色项目 |
显示工具窗口工具栏 | 设置为 false 可隐藏工具窗口上的工具栏。需要重新启动 Visual Studio。工具栏上有用于查看 Cobertura xml 和风险热点的按钮。 |
FCC 解决方案输出目录名称 | 要使 fcc 输出在解决方案的子文件夹中可见,请提供此名称 |
工具目录 | 复制工具子文件夹的文件夹。一定已经存在了。需要重启VS。 |
圈复杂度阈值 | 当方法的圈复杂度超过此值时,该方法将出现在风险热点选项卡中。 |
粘性覆盖表 | 设置为 true 以使覆盖表具有粘性标题。 |
命名空间类 | 设置为 false 以在报告中以简短形式显示类型。影响分组。 |
命名空间资格 | 当 NamespacedClasses 为 true 时,控制报告中类型的限定。 完全合格 - 始终完全合格。 AlwaysUnqualified——始终不合格。 UnqualifiedByNamespace - 按名称空间分组时不合格。 QualifiedByNamespaceLevel - 省略第一个分组级别标识符部分。减少空间,同时保持独特性。 |
隐藏完全覆盖 | 设置为 true 可隐藏完全覆盖的类、命名空间和程序集。 |
隐藏0覆盖范围 | 设置为 true 可隐藏覆盖率为 0% 的类、命名空间和程序集。 |
隐藏0可覆盖 | 设置为 false 以显示不可覆盖的类、命名空间和程序集。 |
启用 | 指定是否启用覆盖输出 |
残疾人无承保 | 将 VS Option Enabled=false 设置为 false 以不禁用覆盖范围 |
测试失败时运行 | 默认情况下,测试失败时会运行覆盖率。设置为 false 可以防止这种情况发生。不能与 RunInParallel 结合使用 |
测试超出时运行 | 指定一个值以仅根据执行测试的数量运行覆盖率。不能与 RunInParallel 结合使用 |
运行MsCode覆盖率 | 更改为 IfInRunSettings 以仅收集已配置的运行设置。是的,用于生成运行设置。 |
包含测试程序集 | 指定是否报告测试程序集的代码覆盖率 |
包括参考项目 | 设置为 true 可将所有直接引用的项目添加到 Include。 |
包含程序集 | 提供要包含在覆盖范围内的程序集列表。使用不带扩展名的dll名称进行匹配。 |
排除程序集 | 提供要从覆盖范围中排除的程序集列表。使用不带扩展名的dll名称进行匹配。 |
开盖/盖布 | |
相邻构建输出 | 如果您的测试依赖于它们的路径,请将其设置为 true。 |
排除 | 过滤表达式以排除特定模块和类型(多个值) |
包括 | 过滤表达式以包含特定模块和类型(多个值) |
按文件排除 | OpenCover 使用 * 通配符匹配。 Coverlet 使用文件系统通配符 |
按属性排除 | 排除程序集、类型和方法级别的属性代码。添加完全限定或非限定的属性类型。 |
并行运行 | 默认情况下,运行 OpenCover / Coverlet 测试,然后执行覆盖。设置为 true 以立即运行覆盖 |
Ms代码覆盖率 | 下面的每个都是要转换为 runsettings 元素的正则表达式数组,请参阅 |
模块路径排除 | 排除 - 匹配由程序集名称或文件路径指定的程序集。 |
模块路径包含 | 包含 - 匹配由程序集名称或文件路径指定的程序集。 |
公司名称排除 | 排除 - 按公司属性匹配程序集。 |
公司名称包括 | 包含 - 按公司属性匹配程序集。 |
PublicKeyTokens 排除 | 排除 - 匹配通过公钥标记签名的程序集。 |
公钥令牌包括 | 包含 - 匹配通过公钥令牌签名的程序集。 |
来源排除 | 排除 - 按定义元素的源文件的路径名来匹配元素。 |
来源包括 | Include - 按定义元素的源文件的路径名匹配元素。 |
属性排除 | 排除 - 匹配具有指定属性的元素。指定属性的全名 |
属性包括 | 包含 - 匹配具有指定属性的元素。指定属性的全名 |
函数排除 | 排除 - 按完全限定名称(包括参数列表)匹配过程、函数或方法。 |
功能包括 | Include - 按完全限定名称(包括参数列表)匹配过程、函数或方法。 |
床单 | |
仅运行设置 | 当运行设置中未指定时,为用于封面数据收集器配置元素的全局和项目选项指定 false |
CoverletCollectorDirectoryPath | 如果您需要 FCC 版本未提供的功能,请指定包含封面收集器文件的目录路径。 |
Coverlet控制台本地 | 指定 true 以使用您自己的 dotnet 工具本地安装 Coverlet 控制台。 |
CoverletConsole自定义路径 | 如果您需要 FCC 版本未提供的功能,请指定 Coverlet 控制台 exe 的路径。 |
CoverletConsole全局 | 指定 true 以使用您自己的 dotnet 工具全局安装 Coverlet 控制台。 |
“CoverletConsole”设置优先级为 Local / CustomPath / Global。 | |
开盖 | |
开封注册 | 如果 FCC 确定的路径 32 或路径 64 不正确,请更改默认值。 |
开放掩护目标 | 如果需要,请提供您自己的目标。 |
OpenCoverTargetArgs | 如果提供您自己的目标,您还可以提供其他参数。 FCC 提供测试 dll 路径。 |
OpenCover自定义路径 | 如果您需要 FCC 版本不提供的功能,请指定打开 cover exe 的路径。 |
NPath 复杂度阈值 | 当某个方法的 npath 复杂性超过此值时,该方法将出现在风险热点选项卡中。 |
废话分数阈值 | 当某个方法的垃圾分数超过此值时,该方法将出现在风险热点选项卡中。 |
您可能希望将 IncludeReferencedProjects 设置为 true。这将确保您不会覆盖测试框架 - 仅覆盖您的代码。
Coverlet 和 OpenCover 使用过滤表达式。过滤表达式
通配符
* => 匹配零个或多个字符 示例
[*]* => 所有程序集中的所有类型。
[coverlet.*]Coverlet.Core.Coverage => Coverlet.Core 命名空间中的 Coverage 类属于与 coverlet.* 匹配的任何程序集(例如 coverlet.core)
[*]Coverlet.Core.Instrumentation.* => 任何程序集中属于 Coverlet.Core.Instrumentation 命名空间的所有类型
[coverlet.*.tests]* => 以 coverlet 开头的任何程序集中的所有类型。并以 .tests 结尾
“排除”和“包含”选项可以一起使用,但“排除”优先。
Ms 代码覆盖率使用正则表达式。您可以在代码覆盖率分析中包含或排除程序集或特定类型和成员。如果 Include 部分为空或省略,则包含所有已加载且具有关联 PDB 文件的程序集。如果程序集或成员与“排除”部分中的子句匹配,则它将从代码覆盖率中排除。 “排除”部分优先于“包含”部分:如果程序集同时在“包含”和“排除”中列出,则它将不会包含在代码覆盖率中。
您可以通过应用 System.Diagnostics.CodeAnalysis 命名空间中存在的 [ExcludeFromCodeCoverage] 属性来忽略代码覆盖率中的方法或整个类。
对于 .Net(不是 .Net Framework),可以在程序集级别应用此属性。
对于 .Net Framework,请参阅上面的 FCCExcludeFromCodeCoverage,了解类似的功能。
要忽略具有不同类型的代码:
您还可以通过添加到“ExcludeByAttribute”列表来忽略其他属性。对于 Coverlet/OpenCover 添加到“ExcludeByAttribute”列表(完全限定或不限定)。对于 ms 代码覆盖率,请添加到“AttributesExclude”列表。这使用正则表达式匹配。
默认情况下,FCC 输出位于每个测试项目的 Debug 文件夹内。如果您愿意,可以指定一个文件夹来包含内部输出并由 FCC 使用的文件。下面的两种方法都会在包含第一个测试项目文件的目录的上一级目录中查找包含 .sln 文件的目录。如果找到这样的解决方案目录,则应用该逻辑。
如果解决方案目录有子目录 fcc-output 那么它将自动使用。
或者,如果您在选项中提供 FCCSolutionOutputDirectoryName,则将在必要时创建目录并使用。
如果您想为此项目做出贡献,请查看贡献指南。
要自行克隆和构建此项目,请确保安装 Visual Studio 的 Extensibility Essentials 扩展,该扩展可启用此项目使用的某些功能。
阿帕奇2.0
床单
开盖
报告生成器
提供者 | 类型 | 关联 |
---|---|---|
贝宝 | 一次 | |
自由支付 | 再次发生的 |