Существуют три основные проблемы в настройке теста, которые вы показываете:
Объявление volumes:
в файле docker-compose.yml
скрывает содержимое дерева /app
в вашем изображении.Это означает, что ваша тестовая установка не тестирует созданный образ.
Ваши команды pip install
устанавливают дополнительные пакеты в среде Python хоста, но они не будут видны внутриКонтейнер Docker.
Каждая команда docker-compose run
запускает новый контейнер с новой эфемерной файловой системой, поэтому после docker-compose run coverage
файловая система временного контейнера, в которой был отчет о покрытии, теряется.
Надеемся, что для базовых показателей покрытия тестами ваши настройки модульных тестов не особенно чувствительны к запуску в Docker, развертыванию по другому пути или с другой рабочей станции разработчика.Установкой, которую я успешно использовал, является запуск модульных тестов и таких вещей, как покрытие кода вне Docker, и только создание и публикация образа Docker в качестве последнего шага.Хотя стоит провести некоторые интеграционные тесты для встроенного образа, вы должны иметь возможность управлять ими из-за пределов Docker, не требуя каких-либо изменений в самом образе.
Если для вас важно запускать эти тесты изнутриDocker, вам нужно либо добавить эти инструменты только для разработки в ваш рабочий образ, либо сделать все (установить дополнительные инструменты, запустить тесты и извлечь результаты) с помощью одной команды docker-compose run
.Однострочник может выглядеть как
docker-compose run \
-v $PWD:/coverage \
sh -c 'pip install coverage && COVERAGE_FILE=/coverage/.coverage coverage run --source=. manage.py test'
Вы также можете разбить это на скрипт, который либо COPYed, либо привязывается к вашему контейнеру
docker-compose run -v $PWD:/coverage /coverage/cov-pytest
, который может быть более удобен в обслуживании.и немного проще вручную проверить.