Как запустить модульные тесты.NET в Docker-контейнере

У меня есть приложение.NET Core, содержащее модульные тесты MSTest. Какой будет команда для выполнения всех тестов с использованием этого Dockerfile?

FROM microsoft/dotnet:1.1-runtime
ARG source
COPY . .
ENTRYPOINT ["dotnet", "test", "Unittests.csproj"]

Структура папок:

/Dockerfile
/Unittests.csproj
/tests/*.cs

2 ответа

Решение

Используйте базовый образ с установленным.NET Core SDK. Например:

microsoft/dotnet
microsoft/dotnet:1.1.2-sdk

Затем запустите dotnet test консольная команда. Вот почему образ на основе SDK требуется - вы не можете запустить dotnet test в образе на основе времени выполнения без SDK. Вот полностью работоспособный Dockerfile пример:

FROM microsoft/dotnet

WORKDIR /app
COPY . .

RUN dotnet restore

# run tests on docker build
RUN dotnet test

# run tests on docker run
ENTRYPOINT ["dotnet", "test"]

RUN Команды выполняются в процессе сборки образа докера.

ENTRYPOINT Команда выполняется при запуске док-контейнера.

Для тех, кто также борется с этим вопросом, но dotnet restoreзанимает очень много времени, я создал Dockerfile ниже, который решил эту проблему для меня:

      FROM mcr.microsoft.com/dotnet/sdk:5.0
WORKDIR /App

# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# Copy everything else and build
COPY ./test ./
RUN dotnet publish -c Release -o out

# run tests on docker run
ENTRYPOINT ["dotnet", "test"]

Примечание: я не включал RUN dotnet testв моем Dockerfile, так как это остановит сборку, если тесты не пройдут, и это не подходит для моего сценария

У меня также был файл .dockerignore со следующим содержимым:

      bin/
obj/

Для справки, это была моя структура папок:

      /bin/
/obj/
/test/*.cs
/.dockerignore
/Dockerfile
/testing.csproj
Другие вопросы по тегам