Следите за нашими новостями на Facebook! Всегда что-нибудь интересное ;)
Будьте в курсе!
Подпишитесь на нашу рассылку, и мы будем присылать вам интересные статьи, анонсы и новости.

Евгений Отроков

Ведущий инженер-разработчик Logrocon

  • Teamlead / Full stack / DevOps
  • Microsoft Certified Professional
  • Microsoft Certified Solutions Associate: Web Applications
  • Microsoft Certified Solutions Developer: App Builde

Запуск тестов внутри контейнеров

"Любой дурак может написать программу, которую поймут компиляторы. Хорошие программисты пишут программы, которые смогут понять другие программисты".

© Мартин Фаулер
Testing
Docker
PostgreSQL
.Net
Появилась задача с тестированием dotnet приложения с работой с БД.

Изначально было принято решение с mock`ом репозиториев работы с БД, что не позволяло протестировать сами запросы в БД. Держать на постоянной основе БД для тестов - это затратно и проблемно со стороны поддержки в актуальном состоянии.

В связи с этим принял решение про сборку БД и приложения в контейнерах: это решает проблемы с тестами запросов и с хранением лишней инфы.

Итак, что у нас есть:
  1. Приложение dotnet core.
  2. Необходимость протестироть БД.

Для того чтобы все завелось, необходимо модифицировать Dockerfile нашего приложения до вида:

FROM mcr.microsoft.com/dotnet/core/aspnet:2.2-stretch-slim AS base
WORKDIR /app

ENV TZ=Europe/Moscow
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

EXPOSE 81

FROM mcr.microsoft.com/dotnet/core/sdk:2.2-stretch AS build
WORKDIR /src

COPY Campus.ProductCache.sln src/
COPY . .

RUN dotnet publish Campus.ProductCache.sln -o /app

FROM build AS test
WORKDIR /app
COPY . .
ENTRYPOINT ["dotnet", "test", "--logger:trx"]

FROM base AS final
WORKDIR /app
COPY --from=build /app .
ENTRYPOINT ["dotnet", "Campus.ProductCache.WebApi.dll"]
Как видно, добавлен блок:
FROM build AS test
WORKDIR /app
COPY . .
ENTRYPOINT ["dotnet", "test", "--logger:trx"]
Так же соберем docker-compose.yml
version: "3.4"

services:
  api:
    environment:
      - NPGSQL_CONNECTION_STRING=Server = postgres; Port = 5432; Database = test; Persist Security Info = True; Pooling = true; MaxPoolSize = 1000; User Id = postgres; Password = postgres;
      - NAME=Campus.ProductCache.WebApi
    build:
      context: .
      dockerfile: Dockerfile
      target: test
    depends_on:
    - postgres
  postgres:
    image: postgres
    restart: always
    environment:
    - POSTGRES_PASSWORD=postgres
    - POSTGRES_USER=postgres
    - POSTGRES_DB=test
    volumes:
      - ./DbScripts/001_init.sql:/docker-entrypoint-initdb.d/init-1.sql
      - ./DbScripts/002_fill_to_test.sql:/docker-entrypoint-initdb.d/init-2.sql
      - ./DbScripts/003_fillbase.sql:/docker-entrypoint-initdb.d/init-3.sql
Где DbScripts/.sql - это скрипты для инициализации базы.

С этим все, осталось запустить нашу сборку командой
docker-compose run --rm api