Файл 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 Файл шаблона БЕЗ модификации
Заполненный пустой файл, без содержимого: ошибка
Файл только с объявлением 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
И этот формат выглядит как внутренняя часть
Теперь я получил фильтрацию для работы, но мне нужно было скопировать все элементы фильтра из конфигурации по умолчанию, так как они теперь не загружаются, поэтому я использовал конфигурацию, подобную следующей:
<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=""$(VsTestExecutable)" /EnableCodeCoverage /Settings:MyProject.runsettings /inIsolation /logger:trx @(TestAssemblies->'"%(FullPath)"',' ') " />
<CreateItem Include="**\*.coverage">
<Output TaskParameter="Include" ItemName="NewCoverageFiles" />
</CreateItem>
<Exec Command=""$(VsCodeCoverageExecutable)" analyze /output:"$(SqCodeCoverageResultsFile)" @(NewCoverageFiles->'"%(FullPath)"',' ') " />
</Target>`
Теперь, выполнив команду анализа CodeCoverage.exe с найденными файлами *.coverage, теперь будет выводиться с тем же именем файла, которое я пытался достичь ранее, и получаться желаемый результат.
MSBuild.SonarQube.Runner.exe получает то, что хочет, у меня есть результаты, которые я хочу, и мир может начать вращаться снова =)
Улучшение: я мог бы использовать CustomTask и искать идеальную или самую последнюю или любую другую логику для этого правильного отдельного файла, чтобы мне не пришлось удалять все мои другие *.coverage файлы. Я мог, но я не сделал этого, потому что он должен работать на сервере сборки, который, по моему мнению, не должен иметь такую историю.