Wykluczanie przez atrybut (ExcludeByAttribute)
W trakcie mojego dążenia do 100% pokrycia kodu testami jednostkowymi stanąłem przed problemem, jakim jest wykluczenie kodu generowanego automatycznie. Niestety tę informację było mi znaleźć strasznie ciężko, dlatego dziele się tym tutaj.
Jak pokazuje dokumentacja, każdy atrybut przeznaczony do wykluczenia należy przekazać osobno:
--exclude-by-attribute 'Obsolete' --exclude-by-attribute'GeneratedCode' --exclude-by-attribute 'CompilerGenerated'
czyli bardziej całościowy przykład:
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
Aby dodać wykluczenie do Nuke, należy zmodyfikować parametry badania pokrycia kodu testami jednostkowymi. Biorąc kawałek kodu z drugiej części o Nuke, należałoby dodać jedną linijkę:
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 | Ta jedna linijka wystarczy, aby wykluczyć kod oznaczony atrybutami CompilerGeneratedAttribute oraz GeneratedCodeAttribute . |