Модульные тесты: За пределами Docker, перед тем как запустить docker build
. В вашем конвейере CI, после проверки исходного кода и выполнения любых шагов установки, таких как установка зависимостей пакетов.
Интеграционные тесты: Запущен снаружи Docker; в зависимости от того, насколько сложна ваша настройка, либо в конце конвейера CI, либо как часть конвейера CD.
Это предполагает настоящий «модульный тест», который не имеет внешних зависимостей; это зависит только от кода приложения / библиотеки, и там, где ему нужны такие вещи, как базы данных, он либо копирует эти зависимости, либо использует что-то вроде встроенного SQLite. (Некоторые фреймворки особенно плохи в этом рабочем процессе и делают невозможным запуск приложения вообще, если база данных недоступна. Но Rails не работает на Python.)
Выполнение модульных тестов в Dockerfile продлится до полуночи, у вас произойдет перебои в работе, и либо ваше быстрое исправление, которое вернет сайт на прежний уровень, приведет к сбою одного неясного модульного теста, либо вы не можете ждать 5- минутное время цикла для запуска всего пакета юнит-тестов. Поскольку в ваших модульных тестах не должно быть зависимостей от среды Docker-or-not, я бы просто запустил их вне Docker.
Зачастую вы можете создать достаточно инфраструктуры, чтобы запускать ваше приложение «по-настоящему» с помощью пары docker run
команд или простой настройки Docker Compose. В этом случае имеет смысл запустить интеграционный тест ближе к концу конвейера CI. При более сложной настройке (возможно, с участием Kubernetes) вам может потребоваться развернуть ее в тестовой среде, и если у вас есть отдельные инструменты CI и CD, это превратится в «тестовое развертывание», «интеграционный тест», «предварительная подготовка». развернуть».
Как разработчик, я считаю, что с инструментами, не входящими в Docker, управлять ими значительно проще, чем инструментами, которые работают только в Docker. (Я не подписываюсь на философию «любой двоичный файл, кроме /usr/bin/docker
, это плохо».) Я бы предпочел просто запустить pytest
или curl
, чем помнить 4-строчный вызов docker run
для выполнения какой-то конкретной задачи. .