Юнит-тесты в докере, как лучше?
От: Sharov Россия  
Дата: 21.04.21 17:29
Оценка:
Здравствуйте.

Допустим имеется сл. Dockerfile :
  стандартный набор

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /

COPY NuGet.Config /root/.nuget/NuGet/NuGet.Config

WORKDIR /src

COPY ["src/prj/prj.csproj", "src/prj/"]
COPY ["src/test/test.csproj", "src/test/"]
RUN dotnet restore "src/prj/prj.csproj"
COPY . .
WORKDIR "/src/src/prj"

#где-то тут нужно копировать файлы для тестов и запускать эти тесты


RUN dotnet build "prj.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "prj.csproj" -c single_exe -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "prj.dll"]


Необходимо в докере скопировать файлы для тестов, как-то получить результат выполнения тестов (успех или нет).
1) как это сделать -- запуск тестов и получение результатов теста;
2) самое главное, как быть с тестовыми файлами, которые для образа не нежны и весят почти ~200Мб?

Для пункта 2) пока видятся две опции -- на этапе сборки в TC создать отдельный контейнер для тестов,
т.е. просто создать образ, прогнать тесты, если все успешно продолжаем дальше и создаем уже другой,
рабочий образ. Минус видится -- все это долго, да и не нужный образ создается. Второй вариант --
все делать в одном контейнере, по результатам теста давать какой-то отчет,
далее все ненужные файлы удаляются и остаются только библиотеки и/или один исполняемый файл.
Кодом людям нужно помогать!
Re: Юнит-тесты в докере, как лучше?
От: VladCore  
Дата: 21.04.21 19:19
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Допустим имеется сл. Dockerfile :

S>
  стандартный набор
S>

S>FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
S>WORKDIR /

S>COPY NuGet.Config /root/.nuget/NuGet/NuGet.Config



S>WORKDIR /src

S>COPY ["src/prj/prj.csproj", "src/prj/"]
S>COPY ["src/test/test.csproj", "src/test/"]
S>RUN dotnet restore "src/prj/prj.csproj"
S>COPY . .
S>WORKDIR "/src/src/prj"

S>#где-то тут нужно копировать файлы для тестов и запускать эти тесты


S>RUN dotnet build "prj.csproj" -c Release -o /app/build

S>FROM build AS publish
S>RUN dotnet publish "prj.csproj" -c single_exe -o /app/publish

S>FROM base AS final
S>WORKDIR /app
S>COPY --from=publish /app/publish .
S>ENTRYPOINT ["dotnet", "prj.dll"]
S>



S>Необходимо в докере скопировать файлы для тестов, как-то получить результат выполнения тестов (успех или нет).

S>1) как это сделать -- запуск тестов и получение результатов теста;
S>2) самое главное, как быть с тестовыми файлами, которые для образа не нежны и весят почти ~200Мб?

S>Для пункта 2) пока видятся две опции -- на этапе сборки в TC создать отдельный контейнер для тестов,

S>т.е. просто создать образ, прогнать тесты, если все успешно продолжаем дальше и создаем уже другой,
S>рабочий образ. Минус видится -- все это долго, да и не нужный образ создается. Второй вариант --
S>все делать в одном контейнере, по результатам теста давать какой-то отчет,
S>далее все ненужные файлы удаляются и остаются только библиотеки и/или один исполняемый файл.

ну для такого докер не нужен. если ты конечно не библитеку пишеш для NET Framework и NET Core. и nuget.config как web.config "уточняется" в каждой подпапке.

А тесты с базами редисами и кучей своих прочих сервисов как системы целиком делаются опцией --exit-code-from имя_котнейнера_с_тестами
docker-compose up --exit-code-from tests

тут tests — это контейнер с единственной командой dotnet test
Отредактировано 21.04.2021 19:19 VladCore . Предыдущая версия .
Re[2]: Юнит-тесты в докере, как лучше?
От: Sharov Россия  
Дата: 21.04.21 20:01
Оценка:
Здравствуйте, VladCore, Вы писали:

VC>ну для такого докер не нужен. если ты конечно не библитеку пишеш для NET Framework и NET Core. и nuget.config как web.config "уточняется" в каждой подпапке.


Просили прогонять в самом докере. А что не так с nuget.config? Там все необходимые репозитории для restore.
Кодом людям нужно помогать!
Re: Юнит-тесты в докере, как лучше?
От: Ночной Смотрящий Россия  
Дата: 22.04.21 16:03
Оценка: 10 (1)
Здравствуйте, Sharov, Вы писали:

Непонятно почему в дотнетный форум.
Варианта два:
1) Строим базовый образ без тестов, потом на его основе другой образ, с тестами.
2) Тесты кладем в отдельный контейнер, на папку с тестами создаем volume, тот же volume подключаем к основному контейнеру
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[2]: Юнит-тесты в докере, как лучше?
От: Sharov Россия  
Дата: 22.04.21 16:15
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Непонятно почему в дотнетный форум.


А куда? Разве что в apptesting, но с др. стороны это больше devops.
Кодом людям нужно помогать!
Re[3]: Юнит-тесты в докере, как лучше?
От: Ночной Смотрящий Россия  
Дата: 22.04.21 16:16
Оценка:
Здравствуйте, Sharov, Вы писали:

НС>>Непонятно почему в дотнетный форум.

S>А куда?

В cloud наверное
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[2]: Юнит-тесты в докере, как лучше?
От: Sharov Россия  
Дата: 22.04.21 18:05
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Варианта два:

НС>1) Строим базовый образ без тестов, потом на его основе другой образ, с тестами.

Это надо на каждый билд? Просто что делать если файлов для тестов добавиться? Каждый раз вручную что-то
пересоздавать?

НС>2) Тесты кладем в отдельный контейнер, на папку с тестами создаем volume, тот же volume подключаем к основному контейнеру


Т.е. создаю контейнер, на папку с тестами создаем volume (чтобы это пока для меня ни значило, я только изучаю
технологию), подключаю volume => могу же его и отключить, так? Т.е. если тесты прошли успешно, отключаю volume
и все?

Как вообще из докера можно результаты тестов манифестировать для того же TC, чтобы он дальше что-то делал или
не делал?
Кодом людям нужно помогать!
Re[3]: Юнит-тесты в докере, как лучше?
От: Ночной Смотрящий Россия  
Дата: 22.04.21 18:09
Оценка: 10 (1)
Здравствуйте, Sharov, Вы писали:

НС>>Варианта два:

НС>>1) Строим базовый образ без тестов, потом на его основе другой образ, с тестами.
S>Это надо на каждый билд?

В смысле? А ты образы что, не на каждый билд собираешь?

НС>>2) Тесты кладем в отдельный контейнер, на папку с тестами создаем volume, тот же volume подключаем к основному контейнеру

S>Т.е. создаю контейнер, на папку с тестами создаем volume (чтобы это пока для меня ни значило, я только изучаю
S>технологию), подключаю volume => могу же его и отключить, так? Т.е. если тесты прошли успешно, отключаю volume
S>и все?

Да.

S>Как вообще из докера можно результаты тестов манифестировать для того же TC, чтобы он дальше что-то делал или

S>не делал?

Надо примаунтить физическую папку, в нее писать результат, потом в ТС оттуда брать файлы.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[4]: Юнит-тесты в докере, как лучше?
От: Sharov Россия  
Дата: 22.04.21 18:18
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

S>>Это надо на каждый билд?

НС>В смысле? А ты образы что, не на каждый билд собираешь?

На каждый, но может тут надо какой-то эталонный собрать и держать про запас.


S>>Как вообще из докера можно результаты тестов манифестировать для того же TC, чтобы он дальше что-то делал или

S>>не делал?
НС>Надо примаунтить физическую папку, в нее писать результат, потом в ТС оттуда брать файлы.

Ясно, буду пробовать через volume.
Кодом людям нужно помогать!
Re: Юнит-тесты в докере, как лучше?
От: Буравчик Россия  
Дата: 23.04.21 09:52
Оценка: 10 (1)
Здравствуйте, Sharov, Вы писали:

S>Необходимо в докере скопировать файлы для тестов, как-то получить результат выполнения тестов (успех или нет).

S>1) как это сделать -- запуск тестов и получение результатов теста;

Все как обычно. Копируешь файлы тестов в контейнер (COPY), запускаешь эти тесты (RUN).
Если тесты успешно пройдены (retcode = 0), то сборка продолжится.
Если тесты упали (retcode != 0), то сборка остановится с ошибкой

S>2) самое главное, как быть с тестовыми файлами, которые для образа не нежны и весят почти ~200Мб?


У тебя же multi-stage сборка. В последний контейнер (final) тестовые файлы не попадут.
Best regards, Буравчик
Re[2]: Юнит-тесты в докере, как лучше?
От: Ночной Смотрящий Россия  
Дата: 23.04.21 11:17
Оценка: +1
Здравствуйте, Буравчик, Вы писали:

Б>У тебя же multi-stage сборка. В последний контейнер (final) тестовые файлы не попадут.


Запускать тесты в процессе сборки имаджа? Злобненько.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[3]: Юнит-тесты в докере, как лучше?
От: Буравчик Россия  
Дата: 23.04.21 11:49
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Запускать тесты в процессе сборки имаджа? Злобненько.


Я согласен, идея странная. Но мне показалось, что именно этого хочется.
Всякое бывает нужно...
Best regards, Буравчик
Re[4]: Юнит-тесты в докере, как лучше?
От: Sharov Россия  
Дата: 23.04.21 12:30
Оценка:
Здравствуйте, Буравчик, Вы писали:

НС>>Запускать тесты в процессе сборки имаджа? Злобненько.

Б>Я согласен, идея странная. Но мне показалось, что именно этого хочется.
Б>Всякое бывает нужно...

Тоже казалось, что идея прогона тестов во время сборки образа странновата.
С другой стороны нужно проверить, что все работает в самом докере.
Т.е. некая часть общая -- образ с исполняемым файлом, а некоторая опциональная --
volume(или что-то вроде) с тестами. С другой стороны, зачем мне исполняемый файл для тестов?
Мне нужны файлы проекта и тестовый проект + бинарные файлы для тестов.

Может как-то так сделать?

COPY ["src/prj/prj.csproj", "src/prj/"]
COPY ["src/test/test.csproj", "src/test/"]
RUN dotnet restore "src/prj/prj.csproj"
COPY . .
WORKDIR "/src/src/prj"
#где-то тут нужно копировать файлы для тестов и запускать эти тесты
RUN dotnet build "prj.csproj" -c Release -o /app/build

ENTRYPOINT ["dotnet", "test","test.prj"]


А потом из TC "docker run img" и анализировать код возврата?

PS: Подумал, что много restore и build получается, отдельные шаги при сборке, при создании образа для тестов,
при создании образа для релиза. С одной сторны, раньше узнаю о проблеме, с др. что будет, если проблема обнаружится
в образа докера, как он себя поведет?
Кодом людям нужно помогать!
Re[5]: Юнит-тесты в докере, как лучше?
От: Sharov Россия  
Дата: 23.04.21 15:00
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Может как-то так сделать?

S>

S>COPY ["src/prj/prj.csproj", "src/prj/"]
S>COPY ["src/test/test.csproj", "src/test/"]
S>RUN dotnet restore "src/prj/prj.csproj"
S>COPY . .
S>WORKDIR "/src/src/prj"
S>#где-то тут нужно копировать файлы для тестов и запускать эти тесты
S>RUN dotnet build "prj.csproj" -c Release -o /app/build

S>ENTRYPOINT ["dotnet", "test","test.prj"]



Похоже, так и надо делать -- https://github.com/dotnet/dotnet-docker/tree/main/samples/complexapp
(Running tests as an opt-in stage)
Кодом людям нужно помогать!
Re[5]: Юнит-тесты в докере, как лучше?
От: Буравчик Россия  
Дата: 23.04.21 16:31
Оценка: +1
Здравствуйте, Sharov, Вы писали:

S>А потом из TC "docker run img" и анализировать код возврата?


И приложение ты будешь из этого докера запускать? Ты же хотел убрать тестовые код/файлы.

Обычно, приложение и тесты складывают в один докер, это самое простое и удобное.
В cmd по-умолчанию прописывают запуск приложения, чтобы просто запускать контейнер docker run.
А для вызова тестов просто подменяешь cmd при запуске — docker run mycommand
Частенько также используют entrypoint-скрипт, который по ключевому определяет что надо запустить — приложение, тесты и др

Минусы этого подхода — в образе хранится ненужный код (например, тесты).

Удалить что-нибудь из образа невозможно. Поэтому если ты хочешь уменьшить размер образа, не включая туда тестовый код, то тебе придется делать два образа — один для релиза, другой для тестов. Здесь есть варианты:
— это могут быть абсолютно разные образы, создаваемые с нуля (dockerfile будут частично дублироваться)
— образ для релиза создается с нуля, а тестовый использует его как базу и добавляет дополнительные тестовые файлы
— оба образа создаются из некоторого заранее подготовленного базового, который содержит общие файлы
Best regards, Буравчик
Re[6]: Юнит-тесты в докере, как лучше?
От: Sharov Россия  
Дата: 24.04.21 11:23
Оценка: 12 (1)
Здравствуйте, Буравчик, Вы писали:

Б>Здравствуйте, Sharov, Вы писали:


S>>А потом из TC "docker run img" и анализировать код возврата?


Б>И приложение ты будешь из этого докера запускать? Ты же хотел убрать тестовые код/файлы.


Б>Обычно, приложение и тесты складывают в один докер, это самое простое и удобное.

Б>В cmd по-умолчанию прописывают запуск приложения, чтобы просто запускать контейнер docker run.
Б>А для вызова тестов просто подменяешь cmd при запуске — docker run mycommand
Б>Частенько также используют entrypoint-скрипт, который по ключевому определяет что надо запустить — приложение, тесты и др

Б>Минусы этого подхода — в образе хранится ненужный код (например, тесты).


Б>Удалить что-нибудь из образа невозможно. Поэтому если ты хочешь уменьшить размер образа, не включая туда тестовый код, то тебе придется делать два образа — один для релиза, другой для тестов. Здесь есть варианты:

Б>- это могут быть абсолютно разные образы, создаваемые с нуля (dockerfile будут частично дублироваться)
Б>- образ для релиза создается с нуля, а тестовый использует его как базу и добавляет дополнительные тестовые файлы
Б>- оба образа создаются из некоторого заранее подготовленного базового, который содержит общие файлы


Я нашел вот такой подход -- https://docs.docker.com/develop/develop-images/multistage-build/
Я выше давал ссылку на гитхаб с этим подходом для приложения на dotnet.

Тут, как я понял, идея в следующем -- один докер файл из которого делаются (--target) разные образы. Т.е.
образ для тестов, образ для прод и т.д. А сам докер файл один. И главное, вроде бы никакого роста объема контейнера.
Кодом людям нужно помогать!
Re[7]: Юнит-тесты в докере, как лучше?
От: Буравчик Россия  
Дата: 24.04.21 12:17
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Тут, как я понял, идея в следующем -- один докер файл из которого делаются (--target) разные образы. Т.е.

S>образ для тестов, образ для прод и т.д. А сам докер файл один. И главное, вроде бы никакого роста объема контейнера.

Да, все верно. Что-то я про --target пропустил
Best regards, Буравчик
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.