{"id":13594777,"url":"https://github.com/FortuneN/FineCodeCoverage","last_synced_at":"2025-04-09T10:32:02.812Z","repository":{"id":37821747,"uuid":"269408236","full_name":"FortuneN/FineCodeCoverage","owner":"FortuneN","description":"Visualize unit test code coverage easily for free in Visual Studio Community Edition (and other editions too)","archived":false,"fork":false,"pushed_at":"2025-03-31T16:46:06.000Z","size":173016,"stargazers_count":562,"open_issues_count":15,"forks_count":43,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-04-07T20:07:53.918Z","etag":null,"topics":["code-coverage","community-edition","coverlet","csharp","dot-net","dot-net-core","dotnet","dotnetcore","fine-code-coverage","finecodecoverage","free","opencover","report-generator","unit-test","unittest","vb","visual-studio","visualisation","visualization","vsix"],"latest_commit_sha":null,"homepage":"https://marketplace.visualstudio.com/items?itemName=FortuneNgwenya.FineCodeCoverage","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/FortuneN.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"FortuneN","liberapay":"FortuneN","ko_fi":"FortuneN","custom":["https://paypal.me/FortuneNgwenya","https://www.buymeacoffee.com/FortuneN"]}},"created_at":"2020-06-04T16:21:00.000Z","updated_at":"2025-04-04T14:42:56.000Z","dependencies_parsed_at":"2023-01-29T18:01:18.219Z","dependency_job_id":"493437d1-b61b-4027-89f5-c72320862ea6","html_url":"https://github.com/FortuneN/FineCodeCoverage","commit_stats":{"total_commits":556,"total_committers":9,"mean_commits":61.77777777777778,"dds":"0.31294964028776984","last_synced_commit":"9b97aa2a4f46ba06e42b508b87dc8f2297b04654"},"previous_names":[],"tags_count":96,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FortuneN%2FFineCodeCoverage","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FortuneN%2FFineCodeCoverage/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FortuneN%2FFineCodeCoverage/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FortuneN%2FFineCodeCoverage/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/FortuneN","download_url":"https://codeload.github.com/FortuneN/FineCodeCoverage/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248020592,"owners_count":21034459,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["code-coverage","community-edition","coverlet","csharp","dot-net","dot-net-core","dotnet","dotnetcore","fine-code-coverage","finecodecoverage","free","opencover","report-generator","unit-test","unittest","vb","visual-studio","visualisation","visualization","vsix"],"created_at":"2024-08-01T16:01:39.014Z","updated_at":"2025-04-09T10:32:02.783Z","avatar_url":"https://github.com/FortuneN.png","language":"C#","funding_links":["https://github.com/sponsors/FortuneN","https://liberapay.com/FortuneN","https://ko-fi.com/FortuneN","https://paypal.me/FortuneNgwenya","https://www.buymeacoffee.com/FortuneN","https://liberapay.com/FortuneN/donate"],"categories":["C#","C\\#"],"sub_categories":[],"readme":"# Fine Code Coverage\n\n[![Highlights video](https://img.youtube.com/vi/CvrySUcTi7I/0.jpg)](https://youtu.be/CvrySUcTi7I)\n\n[![Build status](https://ci.appveyor.com/api/projects/status/yq8s0ridnphpx4ig?svg=true)](https://ci.appveyor.com/project/FortuneN/finecodecoverage)\n\nDownload this extension from the [Visual Studio Market Place ( vs 2019 )](https://marketplace.visualstudio.com/items?itemName=FortuneNgwenya.FineCodeCoverage), [Visual Studio Market Place ( vs 2022 )](https://marketplace.visualstudio.com/items?itemName=FortuneNgwenya.FineCodeCoverage2022)\nor download from [releases](https://github.com/FortuneN/FineCodeCoverage/releases). Older versions can be obtained from [here](https://ci.appveyor.com/project/FortuneN/finecodecoverage/history).\n\n---\n\n## Prerequisites\n\nFor .Net\n\nFCC supports the new [Microsoft.Testing.Platform](https://learn.microsoft.com/en-us/dotnet/core/testing/unit-testing-platform-intro) for MsTest, NUnit and xUnit.\n\nUnfortunately the workaround FCC uses for MSTest, NUnit and xUnit does not apply to TUnit.  \nTUnit has its own dedicated button on the FCC tool window toolbar and cannot be driven from the test explorer window.  \nAs the test explorer window is not used FCC cannot intercept your runsettings ( see later).  \nMicrosoft.Testing.Platform has the [Microsoft code coverage extension](https://learn.microsoft.com/en-us/dotnet/core/testing/microsoft-testing-platform-extensions-code-coverage#microsoft-code-coverage). If you add the package it will be used, otherwise FCC will run dotnet-coverage.  \nThe Microsoft code coverage extension accepts runsettings or [configuration](https://learn.microsoft.com/en-us/dotnet/core/additional-tools/dotnet-coverage#settings) and dotnet-coverage only accepts configuration.\nFCC will supply the necessary settings using FCC's settings system ( below ) but if you want to supply your own, FCC will read the test project file.\nIf either the FCCTestingPlatformCommandLineArguments or TestingPlatformCommandLineArguments property is present FCC will use these [arguments](https://learn.microsoft.com/en-us/dotnet/core/testing/microsoft-testing-platform-intro?tabs=dotnetcli#options) except ones pertaining to coverage other than --coverage-settings ( or --settings) as long as the\npath specified exists.\n\nNote that TUnit blocks coverage of your tests in the GlobalSetup.cs file if using the project template.\n\nWhen not using Microsoft.Testing.Platform you have added test adapters through nuget packages. For instance, the NUnit Test Adapter extension is not sufficient.\n\n---\n\n## Introduction\n\nFine Code Coverage provides code coverage using one of 3 different coverage tools. In previous releases there were two coverage tools being utilised, OpenCover and Coverlet that will be referred to as 'old coverage'.  \nMicrosoft now provides a free coverage solution that you can choose to use by setting the Visual Studio Fine Code Coverage enumeration option RunMsCodeCoverage. This will probably be the preferred coverage tool for most developers. This is not necessary for TUnit.\n\nWith the old coverage it was possible for FCC to provide an abstraction over each tool's exclusion / inclusion options. This abstraction does not work for MS code coverage.  \nThus you will find that there are separate configuration options for Ms coverage vs old coverage and options that are common to the two.\nAssembly level exclusions and inclusions can be achieved - see ExcludeAssemblies and IncludeAssemblies.\nConfiguration is ( mostly ) determined from Visual Studio options, finecodecoverage-settings.xml files and project msbuild properties. All of these settings are optional.\nFor options that have a project scope, these settings form a hierarchy where lower levels override or, for collections, override or merge with the level above. This is described in detail further on.\n\nAside from TUnit projects, the process begins with FCC reacting to the test explorer in visual studio. One of the 3 coverage tools provides the coverage results and the results can be opened from buttons on the Fine Code Coverage Tool Window.\nThis coverage is not dynamic and represents the coverage obtained from the last time you executed tests. When the coverage becomes outdated, you can click the 'FCC Clear UI' button in Tools or run coverage again.\n\nDetails of how FCC is progressing with code coverage can be found in the Coverage Log tab in the Fine Code Coverage Tool Window with more detailed logs in the FCC Output Window Pane. If you experience issues then providing the logs from the output window will help to understand the nature of the problem.\n\n### Coverage Result Presentation\n\n### Report\n\nPresent a single unified report in the Fine Code Coverage Tool Window. The report shows line and branch coverage and risk hotspots with the facility to open your class files.\n\n### Editor\n\nColoured margins to indicate the coverage status of your code. Instrumented ( included and analysable) lines of code are either covered, uncovered or partially covered which means that not all branches were executed.\n\nFCC provides the concept of dirty regions where previously instrumented code will no longer show instrumented status once you have change the code.\n\nFor C# and Visual Basic provides further coverage information :\n\nFCC also allows you to see code that was not included in coverage and new lines that have been added since the last coverage run.\n\nBoth dirty and new line colouring needs to be turned on in options.\n\nIf desired, lines can be highlighted too by setting the available Visual Studio options. Read on for more details.\n\nThe colours can be controlled via Visual Studio / Tools / Options / Environment / Fonts and Colors / Text Editor / Display Items :\n\nFor Visual Studio Community, Professional and Enterprise you can use the settings\n\nCoverage Touched Area FCC\n\nCoverage Partially Touched Area FCC\n\nCoverage Not Touched Area FCC\n\nCoverage Dirty Area FCC\n\nCoverage New Lines Area FCC\n\nCoverage Not Included Area FCC\n\nFor versions that supply the items below FCC will use these by default over the equivalent FCC items so that colours defined in themes can be used.\nIf you wish to be consistent for the 5 available items you can set UseEnterpriseFontsAndColors to false.\n\nCoverage Not Touched Area\n\nCoverage Partially Touched Area\n\nCoverage Touched Area\n\nYou can turn off editor colouring by setting the visual studio option EditorCoverageColouringMode to Off.\nYou can also set the option to DoNotUseRoslynWhenTextChanges if there is a performance issue. By doing so new lines colouring will not be as good.\nIf you switch to one of the EditorCoverageColouringMode options then you will need to re-run coverage.\n\nYou can toggle editor colouring. FCC adds a menu button, Toggle Indicators, in the Tools menu. You can also create a keyboard shortcut -\nTools / Options / Environment / Keyboard, show commands containing \"ToggleIndicators\".\n\nFor Blazor components with @code blocks coverage lines can be generated outside these regions.\nWhen the Roslyn syntax tree is available to FCC you can set the option BlazorCoverageLinesFromGeneratedSource to true to limit coverage lines in .razor file to those in generated source.\n\nFCC tracks the visual studio editor and saves this information when a file is closed. If upon re-opening a file the text has changed outside of a document window there will be no coverage marks for this file as the coverage lines are no longer expected to be correct..\n\nThere will also be no editor marks if you edit a file whilst FCC is collecting coverage.\n\n## Why use MS Code Coverage ?\n\nWith the old coverage FCC needed to copy your test dll and dependencies and run OpenCover or Coverlet on those files. This is not necessary with ms code coverage.\nThe old coverage would wait until tests have finished before starting the coverage tool to re-run all tests. This is not necessary with ms code coverage.\nThe old coverage was based upon every test. Ms code coverage is coverage from the tests you select in the test explorer.\n\n**Supports C++ !** Note that FCC has not been properly tested with C++ projects but with a simple C++ class, tested with Google Test, FCC provides coverage.\n\n## How to utilize MS Code Coverage with FCC ?\n\nMs code coverage requires a [runsettings](https://docs.microsoft.com/en-us/visualstudio/test/configure-unit-tests-by-using-a-dot-runsettings-file?view=vs-2022) file that is configured appropriately for\ncode coverage. This requires that you have the ms code coverage package and have pointed to it with the TestAdaptersPaths element as well as specifying the ms data collector. [Exclusions and inclusions](https://docs.microsoft.com/en-us/visualstudio/test/customizing-code-coverage-analysis?view=vs-2022#include-or-exclude-assemblies-and-members)\nare also specified in the runsettings.\n\nFCC does not require you to do this. If you do not provide a runsettings and RunMsCodeCoverage is Yes then FCC will generate one and write the necessary entry in the project file.  \nNote that having a test project file open in visual studio whilst running tests may result in a conflict warning when FCC removes the entry at the end of the test.\nIf RunMsCodeCoverage is IfInRunSettings then if the project has runsettings that includes the ms data collector element configured correctly then FCC will process the collected results.\n\n## Run settings generation from template\n\nFCC includes the ms code coverage package and will create the necessary runsettings file for each test project being run from the test explorer window.\nThe exclusions and inclusions will come from the combined settings, in a similar manner to the old coverage. As ms code coverage uses regex and has different methods of exclusion / inclusion to\nCoverlet and OpenCover there are ms specific Visual Studio options and associated elements.\n\nAs FCC provides a runsettings file for each test project ( if you have not provided a solution wide or project specific ) it has to write the RunSettingsFilePath element in the project file.  \nAlthough FCC clears the value of this element from the project file it is still present.\n\nFCC creates the runsettings from a template using string replacement. If so desired you can provide your own templates. FCC will look for fcc-ms-runsettings-template.xml in the project directory or the solution directory.\nYour template needs to be a valid xml document but does not need to supply all of the run settings elements. FCC will add the replaceable ResultsDirectory and TestAdaptersPaths ( and the container RunConfiguration element if necessary)\nelements if not present. FCC will also add the ms DataCollector / Configuration / CodeCoverage replaceable elements if not present. It will also add the non exclusion / inclusion recommended CodeCoverage elements AllowLowIntegrityProcesses, CollectFromChildProcesses, CollectAspDotNet and UseVerifiableInstrumentation if not provided. UseVerifiableInstrumentation will be false for .Net Framework.\nTo see the generated run settings use the RunSettingsFilePath element in the project file.\n\nFor a custom template, that provides its own elements that would otherwise have been provided by FCC, to participate in template replacement you need to add strings of the type %fcc_replace%.  \nExcludes and includes follow the format \"%fcc_modulepaths_exclude%\". For FCC to supply the fcc provided ms code coverage path to TestAdaptersPaths use %fcc_testadapter%.\n\n## Non template run settings interception\n\nIt is also possible to use your own runsettings file and have FCC add to it and replace. FCC will ensure that the TestAdaptersPaths element is present as well as the ms data collector. Unlike with a template, if the ms data collector is present then the xml only has replacement applied to it.\n\n## Run settings defaults and merging\n\nMs code coverage does provide a default Configuration / CodeCoverage element if not provided. It will also add some default exclusions for ModulePaths, Attributes, Sources, Functions, and PublicKeyTokens if not present in inclusions or exclusions unless you add the attribute mergeDefaults='false'.\nFor instance for Attributes it will exclude ExcludeFromCodeCoverageAttribute.\n\nIf you are interested in using DotPeek or Reflector against the Microsoft source code within\n...\\AppData\\Local\\FineCodeCoverage\\msCodeCoverage_version\\_\\build\\netstandard2.0\\ there is the Microsoft.VisualStudio.TraceDataCollector.dll.\nsee `DynamicCoverageDataCollector.OnInitialize` for the default configuration logic. The default config is in the resources of Microsoft.CodeCoverage.Core.\n\n## Problems with ms code coverage\n\nPlease check [troubleshooting](https://docs.microsoft.com/en-us/visualstudio/test/troubleshooting-code-coverage?view=vs-2022) before reporting an issue.\n\n## Old style coverage\n\nDlls are copied to a sub folder of project output folder which may affect your tests. The alternative is to set the option AdjacentBuildOutput to true.\nThe coverage is provided by either [OpenCover](https://github.com/OpenCover/opencover) for old style projects and [Coverlet](https://github.com/coverlet-coverage/coverlet)\nfor new style sdk projects. Although FCC provides an abstraction over both so that it is possible to ignore the differences between the two but there are circumstances where\nit is important to be aware of cover tool that will be run. This is most apparent when Coverlet is used, please read on for the specifics.  \nThe other scenario would be when you want to use a specific version of the coverage tool. This can be configured.\n\nThe coverage tools that FCC leverages are by default installed into the FineCodeCoverage directory within `Environment.SpecialFolder.LocalApplicationData`.\nThis can be changed with the ToolsDirectory Visual Studio option. Ensure that this containing directory exists and upon restart the tools will be installed within.\n\n---\n\n### Highlights unit test code coverage\n\nRun a(some) unit test(s) and ...\n\n#### Get highlights on the code being tested and the code doing the testing\n\n![Highlights](Art/preview-coverage.png)\n\n#### Report Coverage View\n\n![Coverage View](Art/Output-Coverage.png)\n\n#### Report Summary View\n\n![Summary View](Art/Output-Summary.png)\n\n#### Report Risk Hotspots View\n\n![Risk Hotspots View](Art/Output-RiskHotspots.png)\n\n## Project configuration\n\nThe hierarchy is as follows :\n\na) Visual Studio options\n\n![Global Options](Art/Options-Global.png)\n\nb) finecodecoverage-settings.xml files\n\nThese are found by walking up the directory structure from the project directory.\nBy applying the attribute topLevel='true' to the root element the walk stops.\n\nGiven finecodecoverage-settings.xml in project directory and finecodecoverage-settings.xml in the solution directory the\nhierachy is :\n\nVisual Studio options\n\nSolution level finecodecoverage-settings.xml\n\nProject level finecodecoverage-settings.xml\n\n```\n\u003cFineCodeCoverage\u003e\n\t\u003cEnabled\u003e\n\t\tTrue\n\t\u003c/Enabled\u003e\n\t\u003c!-- and more --\u003e\n\u003c/FineCodeCoverage\u003e\n```\n\nc) msbuild project file\n\nThere are two ways of supplying these settings.\nDirectly in the project file\n\n```\n\u003cPropertyGroup Label=\"FineCodeCoverage\"\u003e\n  \u003cEnabled\u003e\n\tTrue\n  \u003c/Enabled\u003e\n  \u003cExclude\u003e\n\t[ThirdParty.*]*\n\t[FourthParty]*\n  \u003c/Exclude\u003e\n  \u003cInclude\u003e\n\t[*]*\n  \u003c/Include\u003e\n  \u003cExcludeByFile\u003e\n\t**/Migrations/*\n\t**/Hacks/*.cs\n  \u003c/ExcludeByFile\u003e\n  \u003cExcludeByAttribute\u003e\n\tMyCustomExcludeFromCodeCoverage\n  \u003c/ExcludeByAttribute\u003e\n  \u003cIncludeTestAssembly\u003e\n\tTrue\n  \u003c/IncludeTestAssembly\u003e\n  \u003cModulePathsExclude\u003e\n   .*Fabrikam.Math.UnitTest.dll\n  \u003c/ModulePathsExclude\u003e\n  \u003c!-- and more --\u003e\n\u003c/PropertyGroup\u003e\n```\n\nWith the FineCodeCoverage element.\n\n```\n\u003cPropertyGroup\u003e\n  \u003cFineCodeCoverage\u003e\n    \u003cEnabled\u003e\n\t  True\n    \u003c/Enabled\u003e\n    \u003c!-- and more --\u003e\n  \u003c/FineCodeCoverage\u003e\n\u003c/PropertyGroup\u003e\n```\n\nThis is **necessary** if storing project settings outside your project file and using msbuild Import.\n\nIt is also **necessary if** you want to have the setting element merge with that from the level above as msbuild does not\nsupport custom attributes.\n\n### Controlling merge\n\nThe default is to overwrite each collection property. This can be changed for all settings by setting defaultMerge='true' on the root element.\n\nIf you do supply the merge attribute on a setting element then it will be used.\n\n### Project only\n\n#### Exclude Referenced Project in referenced project ( csproj/vbproj : OPTIONAL )\n\nThis is not transitive.\n\n```\n\u003cPropertyGroup\u003e\n\t\u003cFCCExcludeFromCodeCoverage/\u003e\n\u003c/PropertyGroup\u003e\n```\n\n#### Coverlet specific\n\n```\n\u003cPropertyGroup\u003e\n\t\u003cUseDataCollector/\u003e\n\u003c/PropertyGroup\u003e\n```\n\nCoverlet has different \"drivers\". Fine Code Coverage has in the past only used the coverlet console driver. This has some [issues](https://github.com/coverlet-coverage/coverlet/blob/master/Documentation/KnownIssues.md#1-vstest-stops-process-execution-earlydotnet-test) associated with it.\nIf you encounter **0% coverage or inconsistent coverage** it is now possible to switch to the Data Collector driver. This is the better driver but cannot be used for all projects.\nFor now this is opt in. In the future Fine Code Coverage will determine the appropriate driver.\nPlease consult [coverlet docs](https://github.com/coverlet-coverage/coverlet/blob/master/Documentation/VSTestIntegration.md) for version support.\n\n**Note that it is unnecessary to add the nuget coverlet.collector package as FCC internally supplies it.**\n\nFine Code Coverage will use the Data Collector driver under two circumstances :\n\n1. You are testing with runsettings that contains the coverlet collector ( and not disabled)\n2. You set the UseDataCollector project property\n\nThe Coverlet Data Collector settings can be found [here](https://github.com/coverlet-coverage/coverlet/blob/master/Documentation/VSTestIntegration.md#advanced-options-supported-via-runsettings).\nIf you are using option 2) above then Common settings ( Exclusions and inclusions ) will be generated from project propertes ( above ) and global visual studio options (see below ) with project properties taking precedence.\nIf you are using option 1) then project and global options will only be used where a Common settings Configuration element is absent and the RunSettingsOnly option ( see below) has been changed to false.\n\n#### Options\n\n| Option                                                                          | Description                                                                                                                                                                                                                                                                                                                                                    |\n| ------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| **Common**                                                                      |                                                                                                                                                                                                                                                                                                                                                                |\n| EditorCoverageColouringMode                                                     | Set to Off, or Set to DoNotUseRoslynWhenTextChanges if there is a performance issue                                                                                                                                                                                                                                                                            |\n| BlazorCoverageLinesFromGeneratedSource                                          | Set to true to limit coverage lines in .razor file to those in generated source ( when available)                                                                                                                                                                                                                                                              |\n| ShowEditorCoverage                                                              | Set to false to disable all editor coverage indicators                                                                                                                                                                                                                                                                                                         |\n| ShowCoverageInGlyphMargin                                                       | Set to false to prevent coverage marks in the glyph margin                                                                                                                                                                                                                                                                                                     |\n| ShowCoveredInGlyphMargin                                                        | Set to false to prevent covered marks in the glyph margin                                                                                                                                                                                                                                                                                                      |\n| ShowUncoveredInGlyphMargin                                                      | Set to false to prevent uncovered marks in the glyph margin                                                                                                                                                                                                                                                                                                    |\n| ShowPartiallyCoveredInGlyphMargin                                               | Set to false to prevent partially covered marks in the glyph margin                                                                                                                                                                                                                                                                                            |\n| ShowDirtyInGlyphMargin                                                          | Set to true to show dirty marks in the glyph margin                                                                                                                                                                                                                                                                                                            |\n| ShowNewInGlyphMargin                                                            | Set to true to show new line marks in the glyph margin                                                                                                                                                                                                                                                                                                         |\n| ShowCoverageInOverviewMargin                                                    | Set to false to prevent coverage marks in the overview margin                                                                                                                                                                                                                                                                                                  |\n| ShowCoveredInOverviewMargin                                                     | Set to false to prevent covered marks in the overview margin                                                                                                                                                                                                                                                                                                   |\n| ShowUncoveredInOverviewMargin                                                   | Set to false to prevent uncovered marks in the overview margin                                                                                                                                                                                                                                                                                                 |\n| ShowPartiallyCoveredInOverviewMargin                                            | Set to false to prevent partially covered marks in the overview margin                                                                                                                                                                                                                                                                                         |\n| ShowDirtyInOverviewMargin                                                       | Set to true to show dirty marks in the overview margin                                                                                                                                                                                                                                                                                                         |\n| ShowNewInOverviewMargin                                                         | Set to true to show new line marks in the overview margin                                                                                                                                                                                                                                                                                                      |\n| ShowLineCoverageHighlighting                                                    | Set to true to allow coverage line highlighting                                                                                                                                                                                                                                                                                                                |\n| ShowLineCoveredHighlighting                                                     | Set to false to prevent covered line highlighting                                                                                                                                                                                                                                                                                                              |\n| ShowLineUncoveredHighlighting                                                   | Set to false to prevent uncovered line highlighting                                                                                                                                                                                                                                                                                                            |\n| ShowLinePartiallyCoveredHighlighting                                            | Set to false to prevent partially covered line highlighting                                                                                                                                                                                                                                                                                                    |\n| ShowLineDirtyHighlighting                                                       | Set to true to show dirty line highlighting                                                                                                                                                                                                                                                                                                                    |\n| ShowLineNewHighlighting                                                         | Set to true to show new line highlighting                                                                                                                                                                                                                                                                                                                      |\n| UseEnterpriseFontsAndColors                                                     | Set to false to use FCC Fonts And Colors items                                                                                                                                                                                                                                                                                                                 |\n| ShowToolWindowToolbar                                                           | Set to false to hide the toolbar on the tool window. Requires restarting Visual Studio. The toolbar has buttons for viewing the Cobertura xml and the risk hotspots.                                                                                                                                                                                           |\n| FCC Solution Output Directory Name                                              | To have fcc output visible in a sub folder of your solution provide this name                                                                                                                                                                                                                                                                                  |\n| ToolsDirectory                                                                  | Folder to which copy tools subfolder. Must alredy exist. Requires restart of VS.                                                                                                                                                                                                                                                                               |\n| ThresholdForCyclomaticComplexity                                                | When [cyclomatic complexity](https://en.wikipedia.org/wiki/Cyclomatic_complexity) exceeds this value for a method then the method will be present in the risk hotspots tab.                                                                                                                                                                                    |\n| StickyCoverageTable                                                             | Set to true for coverage table to have a sticky thead.                                                                                                                                                                                                                                                                                                         |\n| NamespacedClasses                                                               | Set to false to show types in report in short form. Affects grouping.                                                                                                                                                                                                                                                                                          |\n| NamespaceQualification                                                          | Control qualification of types in report when NamespacedClasses is true.\u003cbr\u003eFullyQualified - always fully qualify.\u003cbr\u003eAlwaysUnqualified - always unqualified.\u003cbr\u003eUnqualifiedByNamespace - unqualified when grouping by namespace.\u003cbr\u003eQualifiedByNamespaceLevel - omits the first grouping level identifier parts. Reduces space whilst maintaining uniqueness. |\n| HideFullyCovered                                                                | Set to true to hide classes, namespaces and assemblies that are fully covered.                                                                                                                                                                                                                                                                                 |\n| Hide0Coverage                                                                   | Set to true to hide classes, namespaces and assemblies that have 0% coverage.                                                                                                                                                                                                                                                                                  |\n| Hide0Coverable                                                                  | Set to false to show classes, namespaces and assemblies that are not coverable.                                                                                                                                                                                                                                                                                |\n| Enabled                                                                         | Specifies whether or not coverage output is enabled                                                                                                                                                                                                                                                                                                            |\n| DisabledNoCoverage                                                              | Set to false for VS Option Enabled=false to not disable coverage                                                                                                                                                                                                                                                                                               |\n| RunWhenTestsFail                                                                | By default coverage runs when tests fail. Set to false to prevent this. **Cannot be used in conjunction with RunInParallel**                                                                                                                                                                                                                                   |\n| RunWhenTestsExceed                                                              | Specify a value to only run coverage based upon the number of executing tests. **Cannot be used in conjunction with RunInParallel**                                                                                                                                                                                                                            |\n| RunMsCodeCoverage                                                               | Change to IfInRunSettings to only collect with configured runsettings. Yes (default) for runsettings generation. No to use Coverlet or OpenCover.                                                                                                                                                                                                              |\n| IncludeTestAssembly                                                             | Specifies whether to report code coverage of the test assembly                                                                                                                                                                                                                                                                                                 |\n| IncludeReferencedProjects                                                       | Set to true to add all directly referenced projects to Include.                                                                                                                                                                                                                                                                                                |\n| IncludeAssemblies                                                               | Provide a list of assemblies to include in coverage. The dll name without extension is used for matching.                                                                                                                                                                                                                                                      |\n| ExcludeAssemblies                                                               | Provide a list of assemblies to exclude from coverage. The dll name without extension is used for matching.                                                                                                                                                                                                                                                    |\n| \u003cbr\u003e                                                                            |                                                                                                                                                                                                                                                                                                                                                                |\n| **OpenCover / Coverlet**                                                        |                                                                                                                                                                                                                                                                                                                                                                |\n| AdjacentBuildOutput                                                             | If your tests are dependent upon their path set this to true.                                                                                                                                                                                                                                                                                                  |\n| Exclude                                                                         | Filter expressions to exclude specific modules and types (multiple values)                                                                                                                                                                                                                                                                                     |\n| Include                                                                         | Filter expressions to include specific modules and types (multiple values)                                                                                                                                                                                                                                                                                     |\n| ExcludeByFile                                                                   | OpenCover uses \\* wildcard matching. Coverlet uses [file system globbing](https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.filesystemglobbing.matcher?view=dotnet-plat-ext-8.0)                                                                                                                                                               |\n| ExcludeByAttribute                                                              | Exclude attributed code at assembly, type and method level. Add fully qualified or unqualified attribute types.                                                                                                                                                                                                                                                |\n| RunInParallel                                                                   | By default OpenCover / Coverlet tests run and then coverage is performed. Set to true to run coverage immediately                                                                                                                                                                                                                                              |\n| \u003cbr\u003e                                                                            |                                                                                                                                                                                                                                                                                                                                                                |\n| **Ms code coverage**                                                            | Each of below is an array of regexes to be transformed into runsettings elements [see](https://learn.microsoft.com/en-us/visualstudio/test/customizing-code-coverage-analysis?view=vs-2022#include-or-exclude-assemblies-and-members)                                                                                                                          |\n| ModulePathsExclude                                                              | Exclude - Matches assemblies specified by assembly name or file path.                                                                                                                                                                                                                                                                                          |\n| ModulePathsInclude                                                              | Include - Matches assemblies specified by assembly name or file path.                                                                                                                                                                                                                                                                                          |\n| CompanyNamesExclude                                                             | Exclude - Matches assemblies by the Company attribute.                                                                                                                                                                                                                                                                                                         |\n| CompanyNamesInclude                                                             | Include - Matches assemblies by the Company attribute.                                                                                                                                                                                                                                                                                                         |\n| PublicKeyTokens Exclude                                                         | Exclude - Matches signed assemblies by the public key token.                                                                                                                                                                                                                                                                                                   |\n| PublicKeyTokens Include                                                         | Include - Matches signed assemblies by the public key token.                                                                                                                                                                                                                                                                                                   |\n| SourcesExclude                                                                  | Exclude - Matches elements by the path name of the source file in which they're defined.                                                                                                                                                                                                                                                                       |\n| SourcesInclude                                                                  | Include - Matches elements by the path name of the source file in which they're defined.                                                                                                                                                                                                                                                                       |\n| AttributesExclude                                                               | Exclude - Matches elements that have the specified attribute. Specify the full name of the attribute                                                                                                                                                                                                                                                           |\n| AttributesInclude                                                               | Include - Matches elements that have the specified attribute. Specify the full name of the attribute                                                                                                                                                                                                                                                           |\n| FunctionsExclude                                                                | Exclude - Matches procedures, functions, or methods by fully qualified name, including the parameter list.                                                                                                                                                                                                                                                     |\n| FunctionsInclude                                                                | Include - Matches procedures, functions, or methods by fully qualified name, including the parameter list.                                                                                                                                                                                                                                                     |\n| \u003cbr\u003e                                                                            |                                                                                                                                                                                                                                                                                                                                                                |\n| **Coverlet**                                                                    |                                                                                                                                                                                                                                                                                                                                                                |\n| RunSettingsOnly                                                                 | Specify false for global and project options to be used for coverlet data collector configuration elements when not specified in runsettings                                                                                                                                                                                                                   |\n| CoverletCollectorDirectoryPath                                                  | Specify path to directory containing coverlet collector files if you need functionality that the FCC version does not provide.                                                                                                                                                                                                                                 |\n| CoverletConsoleLocal                                                            | Specify true to use your own dotnet tools local install of coverlet console.                                                                                                                                                                                                                                                                                   |\n| CoverletConsoleCustomPath                                                       | Specify path to coverlet console exe if you need functionality that the FCC version does not provide.                                                                                                                                                                                                                                                          |\n| CoverletConsoleGlobal                                                           | Specify true to use your own dotnet tools global install of coverlet console.                                                                                                                                                                                                                                                                                  |\n| **The \"CoverletConsole\" settings have precedence Local / CustomPath / Global.** |                                                                                                                                                                                                                                                                                                                                                                |\n| \u003cbr\u003e                                                                            |                                                                                                                                                                                                                                                                                                                                                                |\n| **OpenCover**                                                                   |                                                                                                                                                                                                                                                                                                                                                                |\n| OpenCoverRegister                                                               | Change from Default if FCC determination of path32 or path64 is incorrect.                                                                                                                                                                                                                                                                                     |\n| OpenCoverTarget                                                                 | Supply your own target if required.                                                                                                                                                                                                                                                                                                                            |\n| OpenCoverTargetArgs                                                             | If supplying your own target you can also supply additional arguments. FCC supplies the test dll path.                                                                                                                                                                                                                                                         |\n| OpenCoverCustomPath                                                             | Specify path to open cover exe if you need functionality that the FCC version does not provide.                                                                                                                                                                                                                                                                |\n| ThresholdForNPathComplexity                                                     | When [npath complexity](https://en.wikipedia.org/wiki/Cyclomatic_complexity) exceeds this value for a method then the method will be present in the risk hotspots tab.                                                                                                                                                                                         |\n| ThresholdForCrapScore                                                           | When [crap score](https://testing.googleblog.com/2011/02/this-code-is-crap.html) exceeds this value for a method then the method will be present in the risk hotspots tab.                                                                                                                                                                                     |\n\n## Exclusions and inclusions\n\nCoverlet and OpenCover use filter expressions.\n\nFilter expressions\n\n\u003e Wildcards\n\u003e\n\u003e \\* =\u003e matches zero or more characters\n\u003e\n\u003e Examples\n\u003e\n\u003e [\\*]\\* =\u003e All types in all assemblies.\n\u003e\n\u003e [coverlet\\.\\*]Coverlet.Core.Coverage =\u003e The Coverage class in the Coverlet.Core namespace belonging to any assembly that matches coverlet.\\* (e.g coverlet.core)\n\u003e\n\u003e [\\*\\]Coverlet.Core.Instrumentation.\\* =\u003e All types belonging to Coverlet.Core.Instrumentation namespace in any assembly\n\u003e\n\u003e [coverlet\\.\\*.tests]\\* =\u003e All types in any assembly starting with coverlet. and ending with .tests\n\u003e\n\u003e Both 'Exclude' and 'Include' options can be used together but 'Exclude' takes precedence.\n\nMs code coverage uses [regexes](https://learn.microsoft.com/en-us/visualstudio/test/customizing-code-coverage-analysis?view=vs-2022#regular-expressions).\n\n\u003e You can include or exclude assemblies or specific types and members from code coverage analysis. If the Include section is empty or omitted, then all assemblies that are loaded and have associated PDB files are included. If an assembly or member matches a clause in the Exclude section, then it is excluded from code coverage. The Exclude section takes precedence over the Include section: if an assembly is listed in both Include and Exclude, it will not be included in code coverage.\n\nJust remember that as soon as there is an include for an assembly all other assemblies that you require coverage for will also need to be included. ( [internals](https://github.com/FortuneN/FineCodeCoverage/issues/489) )  \nIf there are no includes then all assemblies will be included unless explicitly excluded.  \nHence when IncludeTestAssembly is true FCC only explicitly includes it when there are other includes specified.  \n**You may want to set IncludeReferencedProjects to true. This will ensure that you do not get coverage for testing frameworks - only your code.**\n\nYou can ignore a method or an entire class from code coverage by applying the [ExcludeFromCodeCoverage] attribute present in the System.Diagnostics.CodeAnalysis namespace.\n\nFor .Net ( not .Net Framework ) this attribute can be applied at the assembly level.\n\nFor .Net Framework see FCCExcludeFromCodeCoverage, above, for similar functionality.\n\nTo ignore code attributed with a different type:\n\nYou can also ignore additional attributes by adding to the 'ExcludeByAttribute' list\nFor Coverlet/OpenCover add to adding to the 'ExcludeByAttribute' list ( fully qualified or unqualified).\nFor ms code coverage add to the 'AttributesExclude' list. This uses regex matching.\n\n## FCC Output\n\nFCC outputs, by default, inside each test project's Debug folder.\nIf you prefer you can specify a folder to contain the files output internally and used by FCC.\nBoth of the methods below look for a directory containing a .sln file in an ascendant directory of the directory containing the\nfirst test project file. If such a solution directory is found then the logic applies.\n\nIf the solution directory has a sub directory fcc-output then it will automatically be used.\n\nAlternatively, if you supply FCCSolutionOutputDirectoryName in options the directory will be created if necessary and used.\n\n## Contribute\n\nCheck out the [contribution guidelines](CONTRIBUTING.md)\nif you want to contribute to this project.\n\nFor cloning and building this project yourself, make sure\nto install the [Extensibility Essentials](https://marketplace.visualstudio.com/items?itemName=MadsKristensen.ExtensibilityEssentials2022)\nextension for Visual Studio which enables some features\nused by this project.\n\n## License\n\n[Apache 2.0](LICENSE)\n\n## Credits\n\n[Coverlet](https://github.com/coverlet-coverage/coverlet)\n\n[OpenCover](https://github.com/OpenCover/opencover)\n\n[ReportGenerator](https://github.com/danielpalme/ReportGenerator)\n\n## Please support the project\n\n| Provider  |   Type    |                                                        Link                                                         |\n| :-------- | :-------: | :-----------------------------------------------------------------------------------------------------------------: |\n| Paypal    |   Once    | [\u003cimg src=\"https://www.paypalobjects.com/webstatic/mktg/Logo/pp-logo-100px.png\"\u003e](https://paypal.me/FortuneNgwenya) |\n| Liberapay | Recurring |         [\u003cimg alt=\"Donate using Liberapay\" src=\"Art/librepay.png\"\u003e](https://liberapay.com/FortuneN/donate)          |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FFortuneN%2FFineCodeCoverage","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FFortuneN%2FFineCodeCoverage","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FFortuneN%2FFineCodeCoverage/lists"}