Как исключить ссылки на службы из охвата кода с помощью файла runsettings в Visual Studio 2012?
Я использую специальный файл runsettings для контроля того, какие проекты проверяются для покрытия кода. Я использовал шаблон по умолчанию, предоставленный Microsoft, и до сих пор смог исключить элементы, которые я хочу, без проблем. Следующее действие - исключить из охвата кода автогенерируемые классы веб-прокси, созданные Visual Studio при добавлении ссылки на службу.
Казалось бы, что-то, что должно работать с шаблоном шаблонов стандартных по умолчанию, поскольку в нем есть раздел, который выглядит так:
<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 неэквивалентным (мы хотим повторно использовать этот базовый файл для всех проектов без особых изменений)
FYI - хотя я понимаю, что есть другие инструменты для покрытия кода, моя цель состоит в том, чтобы заставить Visual Studio работать, поэтому предложения о переключении на другой инструмент мне не помогают в этом случае.
Ответы
Ответ 1
В 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>
Ответ 2
Спасибо за идею. Я добавил эти строки:
<Source>.*\\Service References\\.*</Source>
<Source>.*\\*.designer.cs*</Source>
и получил нужные мне результаты. Я все еще не понимаю, что я не знаю, почему другие части этого файла не принимаются.
Ответ 3
Похоже, что проблема заключается в периодах в 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>
Ответ 4
Мне удалось настроить этот параметр, установив для атрибута присвоение имен:
<Attributes>
<Exclude>
<Attribute>.*GeneratedCodeAttribute$</Attribute>
</Exclude>
</Attributes>
Не знаю, почему, но должна быть часть полного имени атрибута, которая не соответствует регулярному выражению.