#.net #docker #.net-core #xunit
#.net #docker #.net-core #xunit
Вопрос:
У меня есть проект .NET Core и проект xUnit для его тестирования.
Позже я добавил поддержку Docker в свой основной.Проект NET Core. Я нацелен на Linux и добавил кучу операций в свой файл Docker. Мой образ Docker размещен на Docker Desktop для Windows. Мой проект теперь требует запуска в Docker Linux, поскольку он ссылается на ресурсы, которые я добавил в файл Docker.
Я не понимаю, что делать с моим проектом xUnit. Должен ли я добавить к нему поддержку Docker? Я не хочу копировать содержимое файла Docker моего основного проекта в файл Docker xUnit, поскольку он может измениться, и он создаст изображение, которое является излишне большим для модульного проекта.
Могу ли я вызвать изображение моего основного проекта из моего образа xUnit? Или я могу обойтись без добавления поддержки Docker в мой модульный проект?
Спасибо!
PS: я использую Visual Studio 2019 в Windows
Ответ №1:
Вы можете запускать их, как всегда, из Visual Studio или непосредственно в конвейере сборки с помощью dotnet test
Но, на мой взгляд, лучший способ — запустить их в промежуточном образе docker (образ сборки), чтобы убедиться, что ваше приложение работает также в контексте docker, просто позвонив dotnet test
туда
Хорошо документированный пример: запуск теста dotnet в docker (шаг 5)
FROM mcr.microsoft.com/dotnet/core/sdk:3.0-alpine AS build
WORKDIR /app
COPY *.sln .
COPY src/Example.Service/*.csproj ./src/Example.Service/
COPY test/Example.Service.UnitTest/*.csproj ./test/Example.Service.UnitTest/
COPY test/Example.Service.ComponentTest/*.csproj ./test/Example.Service.ComponentTest/
RUN dotnet restore
# copy full solution over
COPY . .
RUN dotnet build
FROM build AS testrunner
WORKDIR /app/test/Example.Service.UnitTest
CMD ["dotnet", "test", "--logger:trx"]
# run the unit tests
FROM build AS test
WORKDIR /app/test/Example.Service.UnitTest
RUN dotnet test --logger:trx
# run the component tests
FROM build AS componenttestrunner
WORKDIR /app/test/Example.Service.ComponentTest
CMD ["dotnet", "test", "--logger:trx"]
# publish the API
FROM build AS publish
WORKDIR /app/src/Example.Service
RUN dotnet publish -c Release -o out
# run the api
FROM mcr.microsoft.com/dotnet/core/aspnet:3.0-alpine AS runtime
WORKDIR /app
COPY --from=publish /app/src/Example.Service/out ./
EXPOSE 80
ENTRYPOINT ["dotnet", "Example.Service.dll"]
Комментарии:
1. Я думаю, что возможна небольшая оптимизация. разделив инструкцию копирования проектов сборки и тестирования
Ответ №2:
Для работы вам потребуется 5 отдельных изображений
- Начните с SDK
- Создайте образ сборки (только с проектом сборки и без тестового проекта)
- Создайте проект (это экономит больше места)
- Создайте тестовый образ (с проектом сборки и тестовыми проектами)
- Создайте проект
- Запустите тесты
- Начните с runtime image
- Создайте окончательный вывод копирования изображения из 2a.
Ответ №3:
Существует простой способ использования тестовых контейнеров. https://github.com/isen-ng/testcontainers-dotnet
Ответ №4:
Спасибо всем.
Все же хотелось бы сохранить низкую связь и отделить мой основной проект и его Dockerfile от моего проекта модульного тестирования. Мой модульный тест не может выполняться как есть, потому что он пропускает ресурсы, которые находятся в образе docker основного проекта.
По-видимому, Visual Studio не поддерживает выполнение модульных тестов в docker (https://developercommunity.visualstudio.com/idea/554907/allow-running-unit-tests-in-docker.html ).
Комментарии:
1. В .NET core тестовый проект является исполняемым файлом .NET, как и любой другой. Поэтому, если вы создаете два отдельных файла dockerfile, один из которых предназначен для вашего тестового образа, код «основного» проекта будет считаться зависимостью. В зависимости от того, как вы тестируете, вы можете исключить зависимости web / HTTP из этого тестового проекта и образа docker. Вы не получите дружественный пользовательский интерфейс Visual Studio, но создание двух отдельных образов для развертывания основного проекта и модульного тестирования возможно.
2. Re. размер тестового образа обязательно будет больше, если только вы не создадите его таким образом, чтобы использовать HTTP для вызова вашего основного проекта, и в этот момент вы проводите интеграционное тестирование, а не модульное тестирование.