Файл runsettings VS2013 CodeCoverage.exe никогда не анализирует

Среда: Visual Studio 2013 Premium, Win7Ultimate, CodeCoverage.exe

Цель: отчет об охвате кода, который исключает код тестового проекта, который впоследствии будет преобразован в файл.coveragexml для отчетности в SonarQube 5.1.

Досадно, я бы даже не знал об этой ошибке разбора, не добавив /verbose переключиться на команду. Моим единственным признаком сбоя было то, что файл.coverage больше не генерировался, когда я добавил /config переключатель.

Файл работает в интегрированной среде разработки VS2013: файл MyProject.runsettings обеспечивает ожидаемый результат с использованием "Анализ покрытия кода" в среде IDE.

Menu: Test | Test Settings | Select Test Settings File... MyProject.runsettings

Menu: Test | Analyze Code Coverage | All Tests

Попытка запустить CodeCoverage.exe файл для генерации покрытия кода для моих тестов, я не могу использовать ЛЮБОЙ *.runsettings файлы без получения ошибки:

"Error: Failed to parse configuration file <configfile>.runsettings"

Определения пути:

codeCoveragePath = C:\Program Files (x86)\Microsoft Visual Studio 12.0\Team Tools\Dynamic Code Coverage Tools

vstestpath = C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow

myProjectOutputPath = assume correct since I get results when not using /config switch

Ошибка получения команды запуска (допустим, пути указаны правильно): Примечание: я не показываю с /verbose переключаться, так как я не должен использовать его в рабочих условиях

%codeCoveragePath%\CodeCoverage.exe collect /config:MyProject.runsettings /output:CoverageOutput.coverage %vstestpath%\vstest.console.exe %myProjectOutputPath%\MyClass.Tests.Unit.dll

Exe работает, если я не использую /config вариант Если я удалю /config:MyProject.runsettings из команды run я получаю полный отчет, включающий тестовый проект, но который дает мне знать, что остальная часть команды верна, ей просто не нравится файл runsettings.

Я попытался использовать следующие примеры:

Visual Studio 2013 runsettings Файл шаблона БЕЗ модификации

Пример файла MSDN

Заполненный пустой файл, без содержимого: ошибка

Файл только с объявлением xml: ошибка

Файл только с объявленным узлом RunSettings: ошибка

Я даже использовал советы по устранению неполадок от MSDN, тоже: без помощи.

Файл MyProject.runsettings:

<?xml version="1.0" encoding="utf-8"?>
<RunSettings>
  <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>
              <Exclude>
                <ModulePath>.*\.Tests\.Unit\.dll$</ModulePath>
              </Exclude>
            </ModulePaths>
          </CodeCoverage>
        </Configuration>
      </DataCollector>
    </DataCollectors>
  </DataCollectionRunSettings>
</RunSettings>

Кажется, что файл корректен на основании того факта, что среда IDE будет использовать его и генерировать правильные выходные данные в окне "Результаты покрытия кода", сообщая только код MyClass, а не код MyClass.Tests.Unit.

Я нахожусь в момент, когда я думаю, что командной строке CodeCoverage.exe не нравится параметр / config или она использует другую XML-схему.

Обновить

Работает дает вывод, который я хочу, просто не могу указать местоположение файла для следующего шага

%vstestpath%\vstest.console.exe /Settings:MySettings.runsettings %myProjectOutputPath%\MyClass.Tests.Unit.dll

Не работает Дает точный противоположный вывод, который я хочу (только покрытие test.dll в отчете).

%codeCoveragePath%\CodeCoverage.exe collect /output:CoverageOutput.coverage %vstestpath%\vstest.console.exe /Settings:MySettings.runsettings %myProjectOutputPath%\MyClass.Tests.Unit.dll

Все еще ищу ответ.

3 ответа

Я считаю, что вам нужно указать файл runsettings в конце vstest.console.exe с использованием /Settings: флаг (в отличие от флага конфигурации CodeCoverage.exe).

Так что ваша команда становится:

% codeCoveragePath% \ CodeCoverage.exe collect /output:CoverageOutput.coverage% vstestpath% \ vstest.console.exe% myProjectOutputPath% \ MyClass.Tests.Unit.dll /Settings:MyProject.runsettings

У меня возникла та же проблема, и я нашел ваш вопрос при поиске информации о моей ошибке. Я также предположил, что формат файла конфигурации совпадает с форматом.runsettings, используемым vstest.console.exe, но из-за ошибки синтаксического разбора после добавления /verbose я подозревал, что это другой формат, поэтому посмотрел, был ли Конфигурация по умолчанию для CodeCoverage.exe, чтобы увидеть, как она выглядит, и я нашел ее по адресу:

C:\Program Files (x86)\Microsoft Visual Studio 12.0\Team Tools\Dynamic Code Coverage Tools\CodeCoverage.config

И этот формат выглядит как внутренняя часть формата.runsettings.

Теперь я получил фильтрацию для работы, но мне нужно было скопировать все элементы фильтра из конфигурации по умолчанию, так как они теперь не загружаются, поэтому я использовал конфигурацию, подобную следующей:

<CodeCoverage>

  <ModulePaths>
    <Exclude>
    <ModulePath>.*\\unittests.dll</ModulePath>
    </Exclude>
  </ModulePaths>

  <Sources>
    <Exclude>
      <!--extracted from default CodeCoverage.config -->
      <Source>.*\\atlmfc\\.*</Source>
      <Source>.*\\vctools\\.*</Source>
      <Source>.*\\public\\sdk\\.*</Source>
      <Source>.*\\externalapis\\.*</Source>
      <Source>.*\\microsoft sdks\\.*</Source>
      <Source>.*\\vc\\include\\.*</Source>
    </Exclude>
  </Sources>

  <Functions>
    <Exclude>
      <!--extracted from default CodeCoverage.config -->
      <Function>^std::.*</Function>
      <Function>^ATL::.*</Function>
      <Function>.*::__GetTestMethodInfo.*</Function>
      <Function>.*__CxxPureMSILEntry.*</Function>
      <Function>^Microsoft::VisualStudio::CppCodeCoverageFramework::.*</Function>
      <Function>^Microsoft::VisualStudio::CppUnitTestFramework::.*</Function>
      <Function>.*::YOU_CAN_ONLY_DESIGNATE_ONE_.*</Function>
    </Exclude>
  </Functions>

</CodeCoverage>

и командная строка:

CodeCoverage collect /output:coverage.dat /config:coverage.settings vstest.console unitTests.dll /Logger:trx /Settings:test.runsettings

Хорошо, вот идет HACK!!!!

Основные шаги:

  • Найти и удалить все файлы *.coverage
  • Запустите команду vstest БЕЗ [обертка codecoverage.exe]
  • Найдите новые файлы *.coverage и отправьте команду [codecoverage.exe analysis]

подробности

Я обновил файл build.proj, который использовал для выполнения всего этого, чтобы выполнить основные шаги:

<PropertyGroup>
  <SqCodeCoverageResultsFile>VisualStudio.coveragexml</SqCodeCoverageResultsFile>
</PropertyGroup>
<Target Name="BuildTestAssemblyList"
      BeforeTargets="RunAllTestsWithCodeCoverageAndConvertToXmlOutput">
  <CreateItem Include="**\*.Tests.Unit.dll">
    <Output TaskParameter="Include" ItemName="TestAssemblies" />
  </CreateItem>
</Target>
<Target Name="BuildCoverageFileList"
      BeforeTargets="RunAllTestsWithCodeCoverageAndConvertToXmlOutput">
  <CreateItem Include="**\*.coverage">
    <Output TaskParameter="Include" ItemName="CoverageFiles" />
  </CreateItem>    
</Target>
<Target Name="RunAllTestsWithCodeCoverageAndConvertToXmlOutput">
  <Delete Condition="Exists($(SqCodeCoverageResultsFile))" Files="$(SqCodeCoverageResultsFile)" />
  <Delete Files="@(CoverageFiles)" />
  <Exec Command="&quot;$(VsTestExecutable)&quot; /EnableCodeCoverage /Settings:MyProject.runsettings /inIsolation /logger:trx  @(TestAssemblies->'&quot;%(FullPath)&quot;',' ') " /> 
  <CreateItem Include="**\*.coverage">
    <Output TaskParameter="Include" ItemName="NewCoverageFiles" />
  </CreateItem>    
  <Exec Command="&quot;$(VsCodeCoverageExecutable)&quot; analyze /output:&quot;$(SqCodeCoverageResultsFile)&quot; @(NewCoverageFiles->'&quot;%(FullPath)&quot;',' ') " />
</Target>`

Теперь, выполнив команду анализа CodeCoverage.exe с найденными файлами *.coverage, теперь будет выводиться с тем же именем файла, которое я пытался достичь ранее, и получаться желаемый результат.

MSBuild.SonarQube.Runner.exe получает то, что хочет, у меня есть результаты, которые я хочу, и мир может начать вращаться снова =)

Улучшение: я мог бы использовать CustomTask и искать идеальную или самую последнюю или любую другую логику для этого правильного отдельного файла, чтобы мне не пришлось удалять все мои другие *.coverage файлы. Я мог, но я не сделал этого, потому что он должен работать на сервере сборки, который, по моему мнению, не должен иметь такую ​​историю.

Другие вопросы по тегам