SlideShare a Scribd company logo
Запуск тестов с tox и Docker
Александр Кошелев
Moscow Python Meetup #48, 21 августа 2017
Запуск тестов с tox и
Docker
Задача, проблема и
решение
Запуск тестов с tox и Docker
Задача
4
〉Запускать тесты для разных интерпретаторов и зависимостей
〉Быстрый фидбек при разработке
Проблема
5
〉Настроить среду запуска тестов
〉Прогон тестов по ходу разработки
Решение
6
Запускаем тесты в Docker, а внутри него tox
› Docker даёт возможность сделать среду с несколькими
интерпретаторами
› tox позволяет тестировать разный набор зависимостей
Готовый базовый Docker-oбраз
7
themattrix/tox от Matthew Tardiff
› https://hub.docker.com/r/themattrix/tox/
› https://github.com/themattrix/docker-tox
〉Ubuntu 16.04 (Xenial Xerus)
〉Содержит в себе все актуальные интерпретаторы:
Python 2.6, 2.7, 3.3, 3.4, 3.5, 3.6, PyPy и PyPy3
Пример:
django_replicated
Запуск тестов с tox и Docker
Запуск тестов с tox и Docker
Dockerfile
FROM themattrix/tox
MAINTAINER Alexander Koshelev <daevaorn@gmail.com>
Dockerfile из themattrix/tox
FROM themattrix/tox-base
MAINTAINER Matthew Tardiff <mattrix@gmail.com>
ONBUILD COPY install-prereqs*.sh requirements*.txt tox.ini /app/
ONBUILD ARG SKIP_TOX=false
ONBUILD RUN bash -c " 
if [ -f '/app/install-prereqs.sh' ]; then 
bash /app/install-prereqs.sh; 
fi && 
if [ $SKIP_TOX == false ]; then 
TOXBUILD=true tox; 
fi"
ONBUILD [INSTRUCTION]
12
〉Может содержать почти любую Dockerfile-инструкцию
〉Выполняется при сборка образа-наследника
〉Записывается в виде триггера в мета-информацию образа
tox.ini
[tox]
envlist = {py27}-{django16,django18,django19},{py35}-{django18,django19},
{pypy}-{django18,django19}
skipsdist = {env:TOXBUILD:false}
[testenv]
sitepackages = False
deps =
pytest==2.8.7
pytest-django==2.9.1
mock==1.3.0
django16: Django>=1.6,<1.7
django18: Django>=1.8,<1.9
django19: Django>=1.9,<1.10
commands = {env:TOXBUILD:py.test tests}
docker-compose.yaml
tox:
build: .
volumes:
- ".:/src:ro"
Сборка образа
$ docker-compose build tox
Building tox
Step 1 : FROM themattrix/tox
# Executing 3 build triggers...
Step 1 : COPY install-prereqs*.sh requirements*.txt tox.ini /app/
Step 1 : ARG SKIP_TOX=false
---> Running in f9e38f0923f7
Step 1 : RUN bash -c " if [ -f '/app/install-prereqs.sh' ]; then
bash /app/install-prereqs.sh; fi && if [ $SKIP_TOX == false ]; then
TOXBUILD=true tox; fi"
---> Running in 22d0be8c1efa
py27-django16 create: /app/.tox/py27-django16
py27-django16 installdeps: pytest==2.8.7, pytest-django==2.9.1, mock==1.3.0,
Django>=1.6,<1.7
py27-django16 installed:
Django==1.6.11,funcsigs==1.0.2,mock==1.3.0,pbr==3.1.1,py==1.4.34,pytest==2.8.7
,pytest-django==2.9.1,six==1.10.0
py27-django16 runtests: PYTHONHASHSEED='4047276611'
py27-django16 runtests: commands[0] | true
WARNING:test command found but not installed in testenv
cmd: /bin/true
env: /app/.tox/py27-django16
Maybe you forgot to specify a dependency? See also the whitelist_externals
envconfig setting.
py27-django18 create: /app/.tox/py27-django18
...
py27-django19 create: /app/.tox/py27-django19
...
py35-django18 create: /app/.tox/py35-django18
...
py35-django19 create: /app/.tox/py35-django19
...
pypy-django18 create: /app/.tox/pypy-django18
...
pypy-django19 create: /app/.tox/pypy-django19
...
___________________________________ summary ____________________________________
py27-django16: commands succeeded
py27-django18: commands succeeded
py27-django19: commands succeeded
py35-django18: commands succeeded
py35-django19: commands succeeded
pypy-django18: commands succeeded
pypy-django19: commands succeeded
congratulations :)
---> 1aa69980a30e
Step 2 : MAINTAINER Alexander Koshelev <daevaorn@gmail.com>
---> Running in 659b45a37d1f
---> 10065777bc77
Successfully built 10065777bc77
Запуск тестов
$ docker-compose run tox
GLOB sdist-make: /app/setup.py
py27-django16 inst-nodeps: /app/.tox/dist/django_replicated-2.1.zip
py27-django16 installed: Django==1.6.11,django-
replicated==2.1,funcsigs==1.0.2,mock==1.3.0,pbr==3.1.1,py==1.4.34,pytest==2.8.
7,pytest-django==2.9.1,six==1.10.0
py27-django16 runtests: PYTHONHASHSEED='2897087153'
py27-django16 runtests: commands[0] | py.test tests
========================== test session starts ============================
platform linux2 -- Python 2.7.13, pytest-2.8.7, py-1.4.34, pluggy-0.3.1
rootdir: /app, inifile: pytest.ini
plugins: django-2.9.1
collected 25 items
tests/test_dbchecker.py .......
tests/test_decorators.py .
tests/test_middleware.py ............
tests/test_router.py .....
========================== 25 passed in 0.77 seconds ======================
...
__________________________________ summary ________________________________
py27-django16: commands succeeded
py27-django18: commands succeeded
py27-django19: commands succeeded
py35-django18: commands succeeded
py35-django19: commands succeeded
pypy-django18: commands succeeded
ERROR: pypy-django19: commands failed
Запуск теста отдельного окружения
$ docker-compose run tox tox -e pypy-django19
...
pypy-django19 runtests: commands[0] | py.test tests
INTERNALERROR> Traceback (most recent call last):
...
INTERNALERROR> from django.utils.module_loading import module_has_submodule
INTERNALERROR> File "/app/.tox/pypy-django19/site-packages/django/utils/
module_loading.py", line 67, in <module>
INTERNALERROR> from importlib.util import find_spec as importlib_find
INTERNALERROR> ImportError: cannot import name 'find_spec'
ERROR: InvocationError: '/app/.tox/pypy-django19/bin/py.test tests'
____________________________ summary ___________________________________
ERROR: pypy-django19: commands failed
Выводы
Запуск тестов с tox и Docker
Выводы
24
Плюсы
› Удобство и быстрая настройка
› Готовая среда со всеми интерпретаторами
› Минимум кода
Минусы
› Более долгое выполнение тестов из-за старта контейнера
› Нужно использовать Docker :-)
Спасибо!
Александр Кошелев
Руководитель службы разработки
alexkoshelev@yandex-team.ru
@alexkoshelev
daevaorn

More Related Content

PDF
Многопоточное программирование на C#, путевые заметки
PPT
Илья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The Grinder
PDF
Software engineering seminars: gradle
PDF
Как это будет: ASP.NET Core
PPTX
системы сборок проектов
PPTX
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"
PDF
Hunting for a C++ package manager
PDF
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...
Многопоточное программирование на C#, путевые заметки
Илья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The Grinder
Software engineering seminars: gradle
Как это будет: ASP.NET Core
системы сборок проектов
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"
Hunting for a C++ package manager
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...

What's hot (20)

PDF
Про асинхронное сетевое программирование
PDF
Android - 11 - Multithreading
PPTX
Полный цикл разработки на Python + Django
PDF
Леонид Васильев "Python в инфраструктуре поиска"
PDF
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
PDF
Flask как хорошее решение для веб проекта
PDF
Инфраструктура распределенных приложений на Node.js
PPTX
Tdd webpack + testem + mocha + chai
PDF
CI/CD-приложений на Tarantool: от пустого репозитория — до продакшна
PDF
Testing dojo. Вступительная презентация
PDF
Проникновение в Docker с примерами
PDF
Беглый обзор "внутренностей" Python
PDF
Антон Каляев — Быстрое развертывание среды с Vagrant
PPT
Node.js (RichClient)
PDF
Андрей Михайлов. Vagrant. Быстрое развертывание среды
PDF
REPL в Node.js: улучшаем быт разработчик
PDF
Testing with Selenium
PDF
Никита Шультайс. "Система управления версиями git"
PPTX
С чем едят JS-дебаггур?!
PDF
Docker networking
Про асинхронное сетевое программирование
Android - 11 - Multithreading
Полный цикл разработки на Python + Django
Леонид Васильев "Python в инфраструктуре поиска"
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Flask как хорошее решение для веб проекта
Инфраструктура распределенных приложений на Node.js
Tdd webpack + testem + mocha + chai
CI/CD-приложений на Tarantool: от пустого репозитория — до продакшна
Testing dojo. Вступительная презентация
Проникновение в Docker с примерами
Беглый обзор "внутренностей" Python
Антон Каляев — Быстрое развертывание среды с Vagrant
Node.js (RichClient)
Андрей Михайлов. Vagrant. Быстрое развертывание среды
REPL в Node.js: улучшаем быт разработчик
Testing with Selenium
Никита Шультайс. "Система управления версиями git"
С чем едят JS-дебаггур?!
Docker networking
Ad

Similar to Запуск тестов с tox и Docker (20)

PDF
Froglogic Squish
PDF
Непрерывная интеграция Python-проектов в Яндексе
PDF
Drupal code sprint для новичков
PPTX
Менеджер пакетов NuGet
PDF
GitLab, Prometheus и Grafana с Kubernetes
PPTX
Codeception + Docker + Robo и что из этого вышло
PDF
Леонид Васильев "Python в инфраструктуре поиска"
PDF
Practical Python Packaging / Стас Рудаков / Web Developer Wargaming
PPTX
OpenStack - Python Project with 12 Million Lines of code (RUS, Moscow Python ...
PDF
Python Development process in Yandex
PDF
Процессы разработки в Яндексе
PDF
Внедрение Docker в процесс разработки демонов. Доклад Константина Карпова на ...
PDF
Расширь границы возможного вместе с Gradle
PPTX
Процесс разработки и тестирования с Docker + gitlab ci
PDF
Как мы делаем модули PHP в Badoo – Антон Довгаль
PDF
Parallel STL
PDF
Дмитрий Перлов openSUSE Build Server: tips & tricks кросс-дистрибутивной сб...
PDF
Andrii Medvedchuk "Kubernetes and Docker Basics for Running Web Apps"
PPTX
Git for you
PDF
Разработка декстопных приложений для linux (Владимир Яковлев)
Froglogic Squish
Непрерывная интеграция Python-проектов в Яндексе
Drupal code sprint для новичков
Менеджер пакетов NuGet
GitLab, Prometheus и Grafana с Kubernetes
Codeception + Docker + Robo и что из этого вышло
Леонид Васильев "Python в инфраструктуре поиска"
Practical Python Packaging / Стас Рудаков / Web Developer Wargaming
OpenStack - Python Project with 12 Million Lines of code (RUS, Moscow Python ...
Python Development process in Yandex
Процессы разработки в Яндексе
Внедрение Docker в процесс разработки демонов. Доклад Константина Карпова на ...
Расширь границы возможного вместе с Gradle
Процесс разработки и тестирования с Docker + gitlab ci
Как мы делаем модули PHP в Badoo – Антон Довгаль
Parallel STL
Дмитрий Перлов openSUSE Build Server: tips & tricks кросс-дистрибутивной сб...
Andrii Medvedchuk "Kubernetes and Docker Basics for Running Web Apps"
Git for you
Разработка декстопных приложений для linux (Владимир Яковлев)
Ad

Запуск тестов с tox и Docker

  • 2. Александр Кошелев Moscow Python Meetup #48, 21 августа 2017 Запуск тестов с tox и Docker
  • 4. Задача 4 〉Запускать тесты для разных интерпретаторов и зависимостей 〉Быстрый фидбек при разработке
  • 5. Проблема 5 〉Настроить среду запуска тестов 〉Прогон тестов по ходу разработки
  • 6. Решение 6 Запускаем тесты в Docker, а внутри него tox › Docker даёт возможность сделать среду с несколькими интерпретаторами › tox позволяет тестировать разный набор зависимостей
  • 7. Готовый базовый Docker-oбраз 7 themattrix/tox от Matthew Tardiff › https://hub.docker.com/r/themattrix/tox/ › https://github.com/themattrix/docker-tox 〉Ubuntu 16.04 (Xenial Xerus) 〉Содержит в себе все актуальные интерпретаторы: Python 2.6, 2.7, 3.3, 3.4, 3.5, 3.6, PyPy и PyPy3
  • 11. Dockerfile из themattrix/tox FROM themattrix/tox-base MAINTAINER Matthew Tardiff <mattrix@gmail.com> ONBUILD COPY install-prereqs*.sh requirements*.txt tox.ini /app/ ONBUILD ARG SKIP_TOX=false ONBUILD RUN bash -c " if [ -f '/app/install-prereqs.sh' ]; then bash /app/install-prereqs.sh; fi && if [ $SKIP_TOX == false ]; then TOXBUILD=true tox; fi"
  • 12. ONBUILD [INSTRUCTION] 12 〉Может содержать почти любую Dockerfile-инструкцию 〉Выполняется при сборка образа-наследника 〉Записывается в виде триггера в мета-информацию образа
  • 13. tox.ini [tox] envlist = {py27}-{django16,django18,django19},{py35}-{django18,django19}, {pypy}-{django18,django19} skipsdist = {env:TOXBUILD:false} [testenv] sitepackages = False deps = pytest==2.8.7 pytest-django==2.9.1 mock==1.3.0 django16: Django>=1.6,<1.7
  • 16. Сборка образа $ docker-compose build tox Building tox Step 1 : FROM themattrix/tox # Executing 3 build triggers... Step 1 : COPY install-prereqs*.sh requirements*.txt tox.ini /app/ Step 1 : ARG SKIP_TOX=false ---> Running in f9e38f0923f7 Step 1 : RUN bash -c " if [ -f '/app/install-prereqs.sh' ]; then bash /app/install-prereqs.sh; fi && if [ $SKIP_TOX == false ]; then TOXBUILD=true tox; fi" ---> Running in 22d0be8c1efa py27-django16 create: /app/.tox/py27-django16
  • 17. py27-django16 installdeps: pytest==2.8.7, pytest-django==2.9.1, mock==1.3.0, Django>=1.6,<1.7 py27-django16 installed: Django==1.6.11,funcsigs==1.0.2,mock==1.3.0,pbr==3.1.1,py==1.4.34,pytest==2.8.7 ,pytest-django==2.9.1,six==1.10.0 py27-django16 runtests: PYTHONHASHSEED='4047276611' py27-django16 runtests: commands[0] | true WARNING:test command found but not installed in testenv cmd: /bin/true env: /app/.tox/py27-django16 Maybe you forgot to specify a dependency? See also the whitelist_externals envconfig setting. py27-django18 create: /app/.tox/py27-django18 ... py27-django19 create: /app/.tox/py27-django19 ...
  • 18. py35-django18 create: /app/.tox/py35-django18 ... py35-django19 create: /app/.tox/py35-django19 ... pypy-django18 create: /app/.tox/pypy-django18 ... pypy-django19 create: /app/.tox/pypy-django19 ... ___________________________________ summary ____________________________________ py27-django16: commands succeeded py27-django18: commands succeeded py27-django19: commands succeeded py35-django18: commands succeeded py35-django19: commands succeeded pypy-django18: commands succeeded pypy-django19: commands succeeded congratulations :)
  • 19. ---> 1aa69980a30e Step 2 : MAINTAINER Alexander Koshelev <daevaorn@gmail.com> ---> Running in 659b45a37d1f ---> 10065777bc77 Successfully built 10065777bc77
  • 20. Запуск тестов $ docker-compose run tox GLOB sdist-make: /app/setup.py py27-django16 inst-nodeps: /app/.tox/dist/django_replicated-2.1.zip py27-django16 installed: Django==1.6.11,django- replicated==2.1,funcsigs==1.0.2,mock==1.3.0,pbr==3.1.1,py==1.4.34,pytest==2.8. 7,pytest-django==2.9.1,six==1.10.0 py27-django16 runtests: PYTHONHASHSEED='2897087153' py27-django16 runtests: commands[0] | py.test tests ========================== test session starts ============================ platform linux2 -- Python 2.7.13, pytest-2.8.7, py-1.4.34, pluggy-0.3.1 rootdir: /app, inifile: pytest.ini plugins: django-2.9.1 collected 25 items
  • 21. tests/test_dbchecker.py ....... tests/test_decorators.py . tests/test_middleware.py ............ tests/test_router.py ..... ========================== 25 passed in 0.77 seconds ====================== ... __________________________________ summary ________________________________ py27-django16: commands succeeded py27-django18: commands succeeded py27-django19: commands succeeded py35-django18: commands succeeded py35-django19: commands succeeded pypy-django18: commands succeeded ERROR: pypy-django19: commands failed
  • 22. Запуск теста отдельного окружения $ docker-compose run tox tox -e pypy-django19 ... pypy-django19 runtests: commands[0] | py.test tests INTERNALERROR> Traceback (most recent call last): ... INTERNALERROR> from django.utils.module_loading import module_has_submodule INTERNALERROR> File "/app/.tox/pypy-django19/site-packages/django/utils/ module_loading.py", line 67, in <module> INTERNALERROR> from importlib.util import find_spec as importlib_find INTERNALERROR> ImportError: cannot import name 'find_spec' ERROR: InvocationError: '/app/.tox/pypy-django19/bin/py.test tests' ____________________________ summary ___________________________________ ERROR: pypy-django19: commands failed
  • 24. Выводы 24 Плюсы › Удобство и быстрая настройка › Готовая среда со всеми интерпретаторами › Минимум кода Минусы › Более долгое выполнение тестов из-за старта контейнера › Нужно использовать Docker :-)
  • 25. Спасибо! Александр Кошелев Руководитель службы разработки alexkoshelev@yandex-team.ru @alexkoshelev daevaorn