Exclusion by attribute (ExcludeByAttribute)
When I was looking for 100% code coverage with unit tests, I faced the problem of how to exclude automatically generated code. Unfortunately, this information was terribly hard for me to find, so I am sharing it here.
As the documentation shows, each attribute intended for exclusion must be passed separately:
--exclude-by-attribute 'Obsolete' --exclude-by-attribute'GeneratedCode' --exclude-by-attribute 'CompilerGenerated'
More holistic example:
coverlet /path/to/test-assembly.dll --target "dotnet" --targetargs "test /path/to/test-project --no-build" --exclude-by-attribute 'Obsolete' --exclude-by-attribute'GeneratedCode'
Nuke
To add an exclusion to Nuke, you need to modify the parameters of the code coverage. Taking a piece of code from the second part about Nuke, one line would need to be added:
CoverletSettings PrepareCoverageSettingsForCoveringProject(Project project, CoverletSettings settings,
DotNetTestSettings coverageTestSettings, ref string previousCoverageFileResult)
{
var assemblyPath = FindAssemblyForProject(project);
var coverageResultDirectory = TestResultDirectory / project.Name;
settings = settings
.SetAssembly(assemblyPath)
.SetProcessArgumentConfigurator(_ => _.Add(@"--exclude-by-attribute CompilerGeneratedAttribute --exclude-by-attribute GeneratedCodeAttribute")) (1)
.SetOutput(coverageResultDirectory + "/")
.SetTargetSettings(coverageTestSettings
.EnableNoBuild()
.SetProjectFile(project));
settings = MergeCoverageResultsWithPreviousRun(previousCoverageFileResult, settings);
previousCoverageFileResult = SetThresholdForLastRun(project, coverageResultDirectory, ref settings);
return settings;
}
1 | This one line is enough to exclude code marked with CompilerGeneratedAttribute and GeneratedCodeAttribute attributes. |