Как исключить ссылки на службы из покрытия кода с помощью файла runsettings в Visual Studio 2012?
Я использую пользовательский файл runsettings, чтобы контролировать, какие проекты проверяются на предмет покрытия кода. Я использовал шаблон по умолчанию, предоставленный Microsoft, и до сих пор смог исключить элементы, которые я хочу, без проблем. Следующее мое действие - исключить из покрытия кода автоматически сгенерированные классы веб-прокси, которые создаются Visual Studio при добавлении ссылки на службу.
Казалось, что-то, что должно работать с шаблоном runsettings по умолчанию, поскольку у него есть раздел, который выглядит следующим образом:
<Attributes>
<Exclude>
<!-- Don’t forget "Attribute" at the end of the name -->
<Attribute>^System.Diagnostics.DebuggerHiddenAttribute$</Attribute>
<Attribute>^System.Diagnostics.DebuggerNonUserCodeAttribute$</Attribute>
<Attribute>^System.Runtime.CompilerServices.CompilerGeneratedAttribute$</Attribute>
<Attribute>^System.CodeDom.Compiler.GeneratedCodeAttribute$</Attribute>
<Attribute>^System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute$</Attribute>
</Exclude>
</Attributes>
Все классы, созданные при добавлении ссылки на службу, украшены атрибутом GeneratedCodeAttribute, поэтому их следует исключить. Однако, когда я запускаю покрытие кода, они не игнорируются, поэтому покрытие кода сообщает о большом блоке непокрытого кода. Я экспериментировал с регулярным выражением несколько раз, пытаясь заставить его правильно выбрать атрибут, но безрезультатно.
Я был бы признателен за предложения о том, как: - заставить работать это исключение атрибута - альтернативу, которая не требует от меня исключения всего проекта или которая делает файл runsettings не универсальным (мы хотим повторно использовать этот базовый файл по всем проектам без особых правок)
К вашему сведению - хотя я понимаю, что существуют другие инструменты покрытия кода, моя цель здесь - заставить Visual Studio работать, поэтому предложения о переходе на другой инструмент мне в этом случае не помогут.
4 ответа
MSDN имеет страницу, которая описывает, как настроить анализ покрытия кода здесь.
Внизу страницы находится пример файла настроек, который показывает, как исключить атрибуты, и это соответствует тому, что вы имели выше.
Вы можете попробовать некоторые другие методы исключения, которые они упоминают, такие как исключение по пути:
<!-- Match the path of the source files in which each method is defined: -->
<Sources>
<Exclude>
<Source>.*\\atlmfc\\.*</Source>
<Source>.*\\vctools\\.*</Source>
<Source>.*\\public\\sdk\\.*</Source>
<Source>.*\\microsoft sdks\\.*</Source>
<Source>.*\\vc\\include\\.*</Source>
</Exclude>
</Sources>
Похоже, проблема заключается в периодах в RegEx. Если вы избежите их как \.
это начинает работать. Не уверен, почему это важно, поскольку, если это действительно RegEx, точка должна соответствовать любому символу, включая точку.
Таким образом, чтобы исходный шаблон работал, вы должны изменить его на следующее:
<Attributes>
<Exclude>
<Attribute>^System\.Diagnostics\.DebuggerHiddenAttribute$</Attribute>
<Attribute>^System\.Diagnostics\.DebuggerNonUserCodeAttribute$</Attribute>
<Attribute>^System\.Runtime\.CompilerServices\.CompilerGeneratedAttribute$</Attribute>
<Attribute>^System\.CodeDom\.Compiler\.GeneratedCodeAttribute$</Attribute>
<Attribute>^System\.Diagnostics\.CodeAnalysis\.ExcludeFromCodeCoverageAttribute$</Attribute>
</Exclude>
</Attributes>
Также, чтобы вы знали, <ModulePaths>
Фильтры имеют ту же проблему, с которой вы можете использовать:
<ModulePaths>
<Include>
<ModulePath>.*MyCompany\.Namespace\.Project\.dll$</ModulePath>
</Include>
<Exclude>
<ModulePath>.*ThirdParty\.Namespace\.Project\.dll$</ModulePath>
</Exclude>
</ModulePaths>
Спасибо за идею. Я закончил тем, что добавил эти строки:
<Source>.*\\Service References\\.*</Source>
<Source>.*\\*.designer.cs*</Source>
и получил результаты, которые мне были нужны. Я до сих пор не могу понять, почему другие части этого файла не принимаются.
Я смог заставить эту настройку работать, установив имя атрибута в:
<Attributes>
<Exclude>
<Attribute>.*GeneratedCodeAttribute$</Attribute>
</Exclude>
</Attributes>
Не знаю почему, но должна быть часть полного имени атрибута, которая не соответствует регулярному выражению.