dotnet cli - указанный файл .runsettings не используется при выполнении покрытия кода - PullRequest
0 голосов
/ 18 января 2019

У меня есть решение, содержащее два проекта dotnet core 2.1 (c #).

  1. Первое - консольное приложение

  2. Секунды - это тестовый проект с юнит-тестами

Я генерирую статистику покрытия кода для проекта 1 при выполнении тестов в проекте 2 с помощью этой команды:

dotnet test C:\tempDir\SampleApp\Tests\SampleApp.Tests.csproj 
/p:CollectCoverage=true /p:CoverletOutputFormat=cobertura 
/p:CoverletOutput=C:\tempDir\Coverage\coverage 
/p:settings=CodeCoverage.runsettings --filter Category=Unit --logger trx 
--results-directory C:\tempDir\output

Здесь видно, что я указываю CodeCoverage.runsettings в качестве параметра settings - /p:settings=CodeCoverage.runsettings. В моем файле настроек запуска я попросил исключить Program.cs и Startup.cs из покрытия, но они все еще включены в выходной файл coating.cobertura.xml .

Выписка из отчета о результатах ниже:

<classes>
    <class name="SampleApp.Startup" filename="SampleApp\Startup.cs" line-rate="1" branch-rate="0" complexity="2">
      <methods>
        <method name="ConfigureAppConfiguration" signature="(Microsoft.Extensions.Configuration.IConfigurationBuilder)" line-rate="1" branch-rate="0">
          <lines>
            <line number="18" hits="1" branch="False" />
            <line number="19" hits="1" branch="False" />
            <line number="20" hits="1" branch="False" />
          </lines>
        </method>
        <method name="ConfigureLogging" signature="(Microsoft.Extensions.Configuration.IConfiguration,Microsoft.Extensions.Logging.ILoggingBuilder)" line-rate="1" branch-rate="0">
          <lines>
            <line number="23" hits="1" branch="False" />
            <line number="24" hits="1" branch="False" />
            <line number="25" hits="1" branch="False" />
            <line number="26" hits="1" branch="False" />
            <line number="27" hits="1" branch="False" />
          </lines>
        </method>
      </methods>
      <lines>
        <line number="18" hits="1" branch="False" />
        <line number="19" hits="1" branch="False" />
        <line number="20" hits="1" branch="False" />
        <line number="23" hits="1" branch="False" />
        <line number="24" hits="1" branch="False" />
        <line number="25" hits="1" branch="False" />
        <line number="26" hits="1" branch="False" />
        <line number="27" hits="1" branch="False" />
      </lines>
    </class>
</classes>

Мне интересно, что я сделал неправильно в моем файле runsettings? (содержимое файла ниже)

<?xml version="1.0" encoding="utf-8"?>

<RunSettings>
    <!-- Configurations for data collectors -->
    <DataCollectionRunSettings>
        <DataCollectors>
            <DataCollector friendlyName="Code Coverage" uri="datacollector://Microsoft/CodeCoverage/2.0" assemblyQualifiedName="Microsoft.VisualStudio.Coverage.DynamicCoverageDataCollector, Microsoft.VisualStudio.TraceCollector, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
                <Configuration>
                    <CodeCoverage>

                        <ModulePaths>
                            <Include>
                                <ModulePath>.*dll$</ModulePath>
                            </Include>
                            <Exclude>
                                <ModulePath>.*microsoft.*</ModulePath>
                                <ModulePath>.*moq.*</ModulePath>
                                <ModulePath>.*polly.*</ModulePath>
                                <ModulePath>.*fluentassertions.*</ModulePath>
                                <ModulePath>.*newtonsoft.*</ModulePath>
                                <ModulePath>.*SampleApp.Tests.*</ModulePath>
                                <ModulePath>.*\\[^\\]*DocumentManagement[^\\]*\.dll</ModulePath>
                            </Exclude>
                        </ModulePaths>

                        <Functions>
                            <Exclude>
                                <Function>.*\.Program\..*</Function>
                                <Function>.*\.Startup\..*</Function>
                                <Function>.*\.SomeOtherClass\..*</Function>
                            </Exclude>
                        </Functions>

                        <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>

                        <!-- We recommend you do not change the following values: -->
                        <UseVerifiableInstrumentation>True</UseVerifiableInstrumentation>
                        <AllowLowIntegrityProcesses>True</AllowLowIntegrityProcesses>
                        <CollectFromChildProcesses>True</CollectFromChildProcesses>
                        <CollectAspDotNet>False</CollectAspDotNet>

                    </CodeCoverage>
                </Configuration>
            </DataCollector>

        </DataCollectors>
    </DataCollectionRunSettings>
</RunSettings>

Не уверен, почему этот раздел все еще находится здесь в этом выходном отчете, когда я указал, что он пропускается в файле runsettings .

ПРИМЕЧАНИЕ: я пытаюсь избежать засорения моего кода атрибутом [ExcludeFromCodeCoverage], и мне не нужно начинать добавлять /p:ExcludeByFile=Program.cs или /p:ExcludeByFile=Startup.cs к моей тестовой команде в сборках, следовательно, используя файл runsettings .

1 Ответ

0 голосов
/ 23 января 2019

Вы не можете исключить классы, используя файл runsettings , просто указав имя класса.

Элемент Function из настройки run соответствует полному названию функции / метода, например

YourNamespace.YourClass.Method (параметры);

Ниже приведены только возможные настройки из документации :

Другие способы включения или исключения элементов ModulePath - совпадения сборки, указанные в пути к файлу сборки.

CompanyName - сопоставляет сборки по атрибуту Company.

PublicKeyToken - сопоставляет подписанные сборки токеном открытого ключа.

Source - сопоставляет элементы по пути к исходному файлу, в котором они определены.

Атрибут - соответствует элементам, к которым относится определенный атрибут прилагается. Укажите полное имя атрибута и включите «Атрибут» в конце имени.

Функция - полностью сопоставляет процедуры, функции или методы квалифицированное имя. Чтобы соответствовать имени функции, регулярное выражение должно сопоставить полное имя функции, включая пространство имен, имя класса, имя метода и список параметров.

Какие варианты у вас есть:

Вариант 1: Использование запускается с ИЛИ Использование имени метода

        <Functions>
          <Exclude>

            <!-- Exclude all methods in SampleApp.Program : -->
            <Function>^SampleApp\.Program\..*</Function>

            <!-- Exclude all methods named Main: -->
            <Function>.*\.Main\(.*</Function>
          </Exclude>
        </Functions>

В первой функции обратите внимание, что ваше пространство имен с именем класса указано и начинается с символа ^.

Во втором элементе функции обратите внимание, что он проверяет имя метода, проверяя, заканчивается ли строка открывающей скобкой '('.

Вариант 2. Вы можете использовать атрибуты в классах и исключить их из файла runsettings.

Это похоже на атрибут ExcludeFromCodeCoverate.

Обратите внимание на полный файл runsettings в конце этой страницы документации.

...