Azure DevOps: сбои тестов при обращении к нескольким платформам .Net
[Отредактировано: 10 августа]
У меня есть проект, который генерирует DLL (для частного пакета NuGet). Этот проект написан для компиляции в следующих фреймворках:
<TargetFrameworks>netstandard2.0;netstandard2.1</TargetFrameworks>
Решение также содержит четыре тестовых проекта, каждый из которых написан на.NetCore 3.1 (с использованием библиотеки DLL.Netstandard 2.1 из указанного выше проекта).
Они работают нормально в течение нескольких месяцев, но, конечно, я не проверяю, будет ли мой пакет NuGet работать с кодом, использующим платформу.NetStandard 2.0.
Поэтому я обновил тестовые проекты для компиляции в следующих фреймворках:
<TargetFrameworks>net472;net48;netcoreapp3.1</TargetFrameworks>
Я сразу утроил количество тестов, и в Visual Studio они все проходят (уф!). Ну, почти утроилось... каждый проект содержал несколько тестов, которые не были применимы к.NetFramework, поэтому я использовал условную компиляцию, чтобы удалить эти тесты для кода.NetFramework.
Все хорошо....
Однако, когда я отправляю это в Azure, тестовый шаг не выполняется.
Сценарий сборки (yaml) содержит следующие команды:
...
- task: VSBuild@1
displayName: 'Build all'
inputs:
solution: '$(solution)'
platform: '$(buildPlatform)'
configuration: '$(buildConfiguration)'
maximumCpuCount: true
- task: DotNetCoreCLI@2
displayName: 'Run Tests'
inputs:
command: 'test'
projects: '**/*Test.csproj'
arguments: '--configuration $(buildConfiguration) --collect "Code coverage"'
...
(к сведению, мы также подключены к SonarCloud и сообщаем о покрытии кода)
"Заглавные" новости кажутся многообещающими:
Параметры подготовки задания
Использовано 6 переменных времени ожидания
100% тестов пройдено
И когда я вникаю в это, я вижу следующий шаблон для каждого тестового проекта:
Всего тестов: 3650
Пройдено: 3650
Всего тестов: 3650
Пройдено: 3650
Всего тестов: 3652
Пройдено: 3652
Итак, из приведенного выше я вижу, что эти числа соответствуют одному из моих тестовых проектов, выполняемых три раза: один раз для.Net 4.7.2, один раз для.Net 4.8 и один раз для.Core 3.1.
И я вижу аналогичную группу из трех исполнений для каждого из других тестовых проектов.
Итак... все испытания пройдены.
Однако после выполнения версии.NetCore каждого тестового проекта (то есть того, который работал нормально в течение нескольких месяцев), теперь я получаю следующее:
##[error]Error: The process 'C:\Program Files\dotnet\dotnet.exe' failed with exit code 1
"C:\Program Files\dotnet\dotnet.exe" test d:\a\1\s\My.Test.Project\EMy.Test.Project.csproj --logger trx --results-directory d:\a\_temp --configuration Release --collect "Code coverage"
Я не знаю, как это интерпретировать и, следовательно, как исправить.
Я предполагаю, что отчет об анализе кода получает данные о покрытии трижды, что вызывает некоторые проблемы. Если бы это было так, я бы сказал в YAML: "Выполняйте каждый тестовый проект один раз, используя.NetCore 3.1, как мы это делали, и собирайте покрытие кода, но затем выполняйте их все снова, один раз для.Net 4.7. 2, а затем 4.8 без покрытия кода ". Но я не знаю, как это сказать на ямле...
Редактировать 10 августа #1
В ответ на комментарий Кевина Лу ниже я вытащил это из деталей.
Сообщение сборщика данных "Покрытие кода": не удалось инициализировать сборщик данных покрытия кода с ошибкой: System.TypeLoadException: не удалось загрузить тип "Microsoft.VisualStudio.TestPlatform.Utilities.CodeCoverageRunSettingsProcessor" из сборки "Microsoft.TestPlatform.Utilities, Version=15.0.0.0., Культура = нейтральный, PublicKeyToken=b03f5f7f11d50a3a'. в Microsoft.VisualStudio.Coverage.DynamicCoverageDataCollectorImpl.Initialize(XmlElement configurationElement, IDataCollectionSinkdataSink, IDataCollectionLogger logger) в Microsoft.VisualStudio.Coverage.DynamicCoverageDataCollector.OnInitialize(XmlElement configurationElement). Сообщение сборщика данных "Покрытие кода": сборщик данных "Покрытие кода" вызвал исключение во время загрузки, построения или инициализации типа: System.TypeLoadException:Не удалось загрузить тип Microsoft.VisualStudio.TestPlatform.Utilities.CodeCoverageRunSettingsProcessor из сборки Microsoft.TestPlatform.Utilities, Version=15.0.0.0, Culture= нейтральный, PublicKeyToken=b03f5f7f11d50a3a. в Microsoft.VisualStudio.Coverage.DynamicCoverageDataCollectorImpl.Initialize(XMLElement ConfigurationElement, IDataCollectionSinkdataSink, IDataCollectionLogger регистратор) в Microsoft.VisualStudio.Coverage.DynamicCoverageDataCollector.OnInitialize (XmlElement ConfigurationElement) в Microsoft.VisualStudio.TraceCollector.BaseDataCollector.Initialize(XMLElement ConfigurationElement, IDataCollectionEvents событий, IDataCollectionSinkdataSink, IDataCollectionLogger logger, IDataCollectionAgentContext agentContext) в Microsoft.VisualStudio.TraceCollector.BaseDataCollector.Инициализировать (XmlElement ConfigurationElement, DataCollectionEvents события, DataCollectionSink dataSink, DataCollectionLogger регистратор, DataCollectionEnvironmentContext environmentContext) в Microsoft.VisualStudio.TestPlatform.Common.DataCollector.DataCollectorInformation.InitializeDataCollector() в Microsoft.VisualStudio.TestPlatform.Common.DataCollector.DataCollectionManager.LoadAndInitialize(DataCollectorSettings dataCollectorSettings, String settingsXml)..LoadAndInitialize (DataCollectorSettings dataCollectorSettings, String settingsXml)..LoadAndInitialize (DataCollectorSettings dataCollectorSettings, String settingsXml)..
Редактировать 10 августа #2
Я попытался добавить разные пакеты NuGet, чтобы увидеть, смогу ли я заставить это работать, т.е. Microsoft.TestPlatform.ObjectModel
а потом Microsoft.TestPlatform
), но безрезультатно.
Затем я изменил сценарий сборки с:
- task: DotNetCoreCLI@2
displayName: 'Run Tests'
inputs:
command: 'test'
projects: '**/*Test.csproj'
arguments: '--configuration $(buildConfiguration) --collect "Code coverage"'
к
- task: VSTest@2
displayName: 'Run Tests'
inputs:
testSelector: 'testAssemblies'
testAssemblyVer2: |
**\No1Test.dll
**\No2Test.dll
**\No3Test.dll
**\No4Test.dll
searchFolder: '$(System.DefaultWorkingDirectory)'
codeCoverageEnabled: true
runInParallel: true
Это было похоже на шаг назад, однако все тесты пройдены и сообщений об ошибках нет, так что это повод для радости. Но.... это "идеальное" решение?
1 ответ
Из сообщения об ошибке видно, что с используемым вами пакетом возникли некоторые проблемы.
Я хотел бы поделиться пакетами в моем проекте.
Project.csproj
...
<PropertyGroup>
<TargetFrameworks>net472;net48;netcoreapp3.1</TargetFrameworks>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.6.1" />
<PackageReference Include="xunit" Version="2.4.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.1" />
<PackageReference Include="Microsoft.TestPlatform.ObjectModel" Version="16.6.1" />
</ItemGroup>
...
В Microsoft.NET.Test.Sdk
Пакет связан с покрытием кода. Если я удалю этот пакет, тест не пройдёт.
Кстати, сборка выполняется на Microsoft hosted agent: Windows-2019
.
Обновить:
Тест с Microsoft.NET.Test.Sdk
версия: 16.7.0. У меня такая же проблема.
Вы можете попробовать предыдущую версию (например, 16.6.1).
Обновление2:
Microsoft.NET.Test.Sdk
была выпущена версия 16.7.1, которая решает эту проблему.