從 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% 覆蓋率或覆蓋率不一致,現在可以切換到資料收集器驅動程式。這是更好的驅動程序,但不能用於所有專案。目前,這是選擇加入的。請參閱封面文件以取得版本支援。
請注意,無需添加 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」清單來忽略其他屬性。對於 ms 程式碼覆蓋率,請新增至「AttributesExclude」清單。這使用正規表示式匹配。
預設情況下,FCC 輸出位於每個測試項目的 Debug 資料夾內。如果您願意,可以指定一個資料夾來包含內部輸出並由 FCC 使用的檔案。下面的兩種方法都會在包含第一個測試項目檔案的目錄的上一層目錄中尋找包含 .sln 檔案的目錄。如果找到這樣的解決方案目錄,則套用該邏輯。
如果解決方案目錄有子目錄 fcc-output 那麼它將自動使用。
或者,如果您在選項中提供 FCCSolutionOutputDirectoryName,則將在必要時建立目錄並使用。
如果您想為此專案做出貢獻,請查看貢獻指南。
若要自行複製和建置此項目,請確保安裝 Visual Studio 的 Extensibility Essentials 擴展,該擴充功能可啟用此項目使用的某些功能。
阿帕契2.0
床單
開蓋
報告產生器
提供者 | 類型 | 關聯 |
---|---|---|
貝寶 | 一次 | |
自由支付 | 再次發生的 |