Что вызывает ошибку "Не удалось найти сборщик данных" XPlat Code Coverage "" в образе Docker?

Я настраиваю сборку на DevOps Server, которая просто запускает сборку Docker, запускает контейнер и собирает с него результаты тестирования. Dockerfile использует образ mcr.microsoft.com/dotnet/core/sdk:2.2 в качестве своей базы, поверх которой я установил powershell.

Запуск базового образа и выполнение dotnet --version подтверждает, что на нем установлен.NET Core 2.2.301. Проект "Мои тесты" ссылается на coverlet.collector 1.0.1 и Microsoft.NET.Test.Sdk 16.1.0. Из документации Coverlet, которую я видел, этого должно быть достаточно для получения результатов тестового покрытия.

Мои тесты работают нормально и генерируют ожидаемый файл trx, когда я не использую Coverlet.

Вот упрощенная версия моего dockerfile:

FROM myrepo/coresdk22-powershell AS build
SHELL ["pwsh", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
USER ContainerAdministrator
# Not shown: some configuration steps using powershell
WORKDIR /app
COPY webapiapp/*.csproj ./webapiapp/
WORKDIR /app/webapiapp
RUN dotnet restore --configfile ../nuget.config
WORKDIR /app/
COPY webapiapp/. ./webapiapp/
WORKDIR /app/webapiapp
RUN dotnet publish -c Release -o out

FROM build AS testrunner
WORKDIR /app/webapiapp.test
COPY webapiapp.test/. .
RUN dotnet build -c Release -o out
WORKDIR /app/webapiapp.test/out
ENV Coverage="XPlat Code Coverage"
ENTRYPOINT dotnet vstest webapiapp.test.dll --logger:trx --collect:$env:Coverage

Вот команда запуска:

docker run -v "c:\testresults:C:\app\webapiapp.test\out\TestResults" --rm myrepo/webapiapp:$(BUILD.BUILDID)-test

А вот и webapiapp.test.csproj:

  <PropertyGroup>
    <TargetFramework>netcoreapp2.2</TargetFramework>

    <IsPackable>false</IsPackable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="coverlet.collector" Version="1.0.1">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.1.0" />
    <PackageReference Include="xunit" Version="2.4.0" />
    <PackageReference Include="xunit.runner.visualstudio" Version="2.4.0" />
  </ItemGroup>

</Project>

Вместо файла покрытия я получаю "Не удалось найти сборщик данных" XPlat Code Coverage "". Что мне не хватает?

2 ответа

Я получал ту же ошибку, и исправление для меня заключалось в добавлении ссылки на nuget ниже.

<PackageReference Include="coverlet.collector" Version="1.0.1" />

Я пытался заставить покрытие кода работать в моем конвейере DevOps, и это помогло мне.

Я следовал приведенному ниже руководству с api шаблона по умолчанию (пример WeatehrForecast)

https://docs.microsoft.com/en-us/azure/devops/pipelines/ecosystems/dotnet-core?view=azure-devops

Если вы пытаетесь запуститьdotnet testдля dll вам нужно запуститьdotnet publishпервый. Это обсуждается и упоминается здесь и здесь .

Для примера из вопроса нам нужно заменить следующую строку на этапе testrunner.

      RUN dotnet build -c Release -o out
# ->
RUN dotnet publish -c Release -o out
Другие вопросы по тегам