tox – тестирование на разных версиях Python

онлайн тренер по питону
Онлайн-тренажер Python 3 для начинающих

Теория без воды. Задачи с автоматической проверкой. Подсказки на русском языке. Работает в любом современном браузере.

начать бесплатно

Введение

Когда вы создаёте библиотеку или приложение на Python, важно убедиться, что оно работает на разных версиях интерпретатора. Особенно если вы публикуете пакет на PyPI. Вручную устанавливать Python 3.7, 3.8, 3.9 и прогонять тесты — долго и неудобно.

Здесь помогает tox – тестирование на разных версиях Python — инструмент, который автоматизирует запуск тестов в изолированных окружениях с разными интерпретаторами, устанавливает зависимости и обеспечивает воспроизводимость.

Установка и настройка tox

Установка:

bash
pip install tox

Создание файла конфигурации tox.ini:

ini
[tox] envlist = py38, py39, py310 [testenv] deps = pytest commands = pytest

Основы работы с tox

  • tox автоматически создаёт виртуальные окружения: tox -e py39

  • Устанавливает зависимости из deps

  • Выполняет команду, указанную в commands

  • Работает с любой системой тестирования: pytest, unittest, nose

Запуск всех окружений:

bash
tox

Конфигурация tox.ini

Минимальный пример:

ini
[tox] envlist = py38, py39 [testenv] deps = pytest commands = pytest tests/

Настройка специфичных окружений:

ini
[testenv:lint] deps = flake8 commands = flake8 src/

Тестирование на разных версиях Python

  • В envlist указываются псевдонимы окружений: py38, py39, py310

  • Tox ищет соответствующий Python-интерпретатор в вашей системе

  • Используйте pyenv или asdf для установки нужных версий

Проверка доступных интерпретаторов:

bash
tox --listenvs-all

Управление зависимостями

Вы можете:

  • Указывать зависимости явно:

ini
deps = pytest requests
  • Загружать их из файла:

ini
deps = -rrequirements.txt
  • Использовать pyproject.toml через tox >= 4.0 и tox-pdm, tox-poetry

Расширенные конфигурации и параллелизм

Запуск тестов параллельно:

bash
tox -p auto

Использование специфичных переменных окружения:

ini
[testenv] passenv = MY_ENV_VAR

Тестирование дополнительных сценариев

Пример проверки кода линтером и форматером:

ini
[testenv:style] deps = flake8 black commands = black --check . flake8 .

Добавление проверки типов:

ini
[testenv:types] deps = mypy commands = mypy src/

Интеграция с CI/CD

GitHub Actions

yaml
jobs: test: strategy: matrix: python-version: [3.8, 3.9, 3.10] runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Setup Python uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - run: pip install tox - run: tox -e py${{ matrix.python-version | replace('.', '') }}

GitLab CI

yaml
tox: script: - pip install tox - tox

Работа с pyproject.toml и PEP 621

Tox 4.0 и выше умеет читать зависимости из pyproject.toml, поддерживает современные менеджеры зависимостей: Poetry, PDM, Hatch.

Для интеграции:

bash
pip install tox-poetry

Плагины и расширения tox

  • tox-gh-actions — автоматизация matrix-окружений

  • tox-conda — окружения через Conda

  • tox-pdm, tox-poetry — работа с альтернативными менеджерами

Установка:

bash
pip install tox-gh-actions

Отладка и логирование

Полный вывод команд:

bash
tox -vv

Показ всех логов:

bash
tox --showconfig

Удаление кэша:

bash
tox -r # пересоздание окружений

Сравнение с другими инструментами

Инструмент Мульти-Python Параллельность Поддержка Pyproject Простота
tox Да Да Частично (с плагинами) Высокая
nox Да Да Да Средняя
virtualenv Нет Нет Нет Высокая

Советы по оптимизации и best practices

  • Используйте tox -e для запуска одного окружения

  • Удаляйте неиспользуемые зависимости

  • Храните tox.ini в корне проекта

  • Кэшируйте tox в CI/CD для ускорения сборки

Часто задаваемые вопросы (FAQ)

1. Что такое tox?
Это инструмент для автоматического тестирования Python-кода в изолированных окружениях с разными версиями Python.

2. Как задать зависимости для окружений?
Через секцию deps или requirements.txt.

3. Можно ли запускать линтеры и типизацию?
Да, через отдельные testenv.

4. Где установить несколько версий Python?
Через pyenv, asdf, system packages.

5. Как использовать с Pytest?
Укажите deps = pytest, commands = pytest.

6. Поддерживает ли tox pyproject.toml?
С версии 4.0 и выше — да, через плагины.

Полный справочник по ключевым функциям и модулям библиотеки Tox для Python

Установка

bash
pip install tox

Базовое использование

bash
tox # запускает все environments tox -e py39 # запускает конкретную среду (например, Python 3.9) tox -r # принудительно пересобрать виртуальные окружения

Структура конфигурации (файл tox.ini)

ini
[tox] envlist = py38, py39 [testenv] deps = pytest commands = pytest
Секция Описание
[tox] Основные параметры (например, список версий).
[testenv] Базовая среда для тестов.
[testenv:<name>] Индивидуальные среды.

Полный пример tox.ini

ini
[tox] envlist = py38, py39, lint, typecheck [testenv] deps = pytest commands = pytest tests/ [testenv:lint] description = Запуск линтера flake8 deps = flake8 commands = flake8 src/ tests/ [testenv:typecheck] description = Проверка типов mypy deps = mypy commands = mypy src/

Поддержка нескольких версий Python

Возможность Описание
envlist = py36, py37, py38 Автоматический запуск на нескольких версиях.
Требуется, чтобы соответствующие Python были установлены в системе.  

Установка зависимостей

Опция Описание
deps = package Установка зависимостей в виртуальную среду.
deps = -r requirements.txt Использование pip-файла.
ini
[testenv] deps = -rrequirements.txt pytest

Команды и выполнение

Опция Описание
commands = ... Команды, которые будут выполнены (одна или несколько).
passenv = VAR Передача переменных окружения.
setenv = KEY=VALUE Установка переменных окружения в среде.
ini
[testenv] setenv = ENV=production passenv = CI GITHUB_ACTIONS commands = pytest

Указание интерпретатора

ini
[testenv:py311] basepython = python3.11

Переиспользование среды (ускорение)

ini
[testenv] recreate = False

Или запустить с флагом --skip-pkg-install или -r для пересборки.


Запуск произвольных команд (например, black, isort, coverage)

ini
[testenv:format] deps = black commands = black --check src/ tests/ [testenv:coverage] deps = coverage commands = coverage run -m pytest coverage report

Поддержка дополнительных плагинов

Плагин Назначение
tox-gh-actions Поддержка GitHub Actions
tox-pyenv Поиск версий Python через pyenv
tox-docker Запуск окружений с помощью Docker-контейнеров
bash
pip install tox-gh-actions

Интеграция с GitHub Actions (через tox-gh-actions)

ini
[tox] envlist = py38, py39 [gh-actions] python = 3.8: py38 3.9: py39

Параллельный запуск сред

bash
tox -p auto
Флаг Описание
-p или --parallel Запуск сред параллельно.
--parallel-live Вывод логов в реальном времени.

Использование внешнего файла конфигурации

bash
tox -c alt_config.ini

Просмотр доступных сред

bash
tox -av

Расширенная настройка: разработка, тесты, типизация, линтер

ini
&nbs