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, которая решает эту проблему.

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