Как запустить Tox с Travis-CI
Как вы тестируете разные версии Python с Tox из Travis-CI?
У меня есть tox.ini
:
[tox]
envlist = py{27,33,34,35}
recreate = True
[testenv]
basepython =
py27: python2.7
py33: python3.3
py34: python3.4
py35: python3.5
deps =
-r{toxinidir}/pip-requirements.txt
-r{toxinidir}/pip-requirements-test.txt
commands = py.test
который запускает мои Python unittests в нескольких версиях Python и отлично работает.
Я хочу настроить сборку в Travis-CI, чтобы автоматически запускать ее, когда я нажимаю изменения в Github, поэтому у меня есть .travis.yml
:
language: python
python:
- "2.7"
- "3.3"
- "3.4"
- "3.5"
install:
- pip install tox
script:
- tox
Это технически, похоже, работает, но он избыточно запускает все мои тесты в каждой версии Python... из каждой версии Python. Итак, сборка, которая занимает 5 минут, занимает 45 минут.
Я попытался удалить список python
из моего файла yaml, поэтому Travis будет запускать только один экземпляр Python, но это приводит к тому, что мои тесты Python3.5 терпят неудачу, потому что интерпретатор 3.5 не может быть найден. По-видимому, что известное ограничение, поскольку Travis-CI не будет устанавливать Python3.5, если вы не укажете точную версию в своей конфигурации... но это не делает этого для других версий.
Есть ли способ, которым я могу это решить?
Ответы
Ответ 1
Для этого я бы подумал об использовании ток-травина. Это плагин, который позволяет использовать несколько версий Python от Travis CI и полную конфигурацию Toxs.
Для этого вы должны настроить файл .travis.yml для тестирования с помощью Python:
sudo: false
language: python
python:
- "2.7"
- "3.4"
install: pip install tox-travis
script: tox
Это будет запускать соответствующие testenvs, которые являются объявленными env с py27 или py34 в качестве факторов имени по умолчанию. Py27 или py34 будут использоваться в качестве резервного, если никакие среды не соответствуют данному коэффициенту.
Дополнительная литература
Ответ 2
Travis предоставляет версию python для каждого теста как TRAVIS_PYTHON_VERSION
, но в форме '3.4'
, а tox
ожидает 'py34'
.
Если вы не хотите полагаться на внешний lib (ток-травис) для выполнения перевода, вы можете сделать это вручную:
language: python
python:
- "2.7"
- "3.3"
- "3.4"
- "3.5"
install:
- pip install tox
script:
- tox -e $(echo py$TRAVIS_PYTHON_VERSION | tr -d .)
Найдите этот шаблон в поисковой системе, и вы найдете много его проектов.
Это работает и для pypy:
tox -e $(echo py$TRAVIS_PYTHON_VERSION | tr -d . | sed -e 's/pypypy/pypy/')
Источник: flask-mongoengine .travis.yml.
Ответ 3
Для большего контроля и гибкости вы можете вручную определить свою матрицу так, чтобы она соответствовала версии Python и токсичности:
language: python
matrix:
include:
- python: 2.7
env: TOXENV=py27
- python: 3.3
env: TOXENV=py33
- python: 3.4
env: TOXENV=py34
- python: 3.5
env: TOXENV=py35
- python: pypy
env: TOXENV=pypy
- env: TOXENV=flake8
install:
- pip install tox
script:
- tox
Если это не очевидно, каждая запись в матрице начинается с строки, начинающейся с дефиса (-
). Любые элементы, следующие за этой строкой, которые являются отступом, являются дополнительными линиями для этого единственного элемента.
Например, все записи, за исключением последних, являются двумя строками. последняя запись - только одна строка и не содержит настройки python
; поэтому он просто использует версию Python по умолчанию (Python 2.7 в соответствии с документацией Travis). Конечно, конкретная версия Python не так важна для этого теста. Если вы хотите выполнить такой тест как с Python 2, так и с 3 (один раз каждый), рекомендуется использовать версии Travis по умолчанию (2.7 и 3.4), чтобы тесты выполнялись быстрее, поскольку они не нуждаются в сначала установите нестандартную версию Python. Например:
- python: 2.7
env: TOXENV=flake8
- python: 3.4
env: TOXENV=flake8
То же самое работает с pypy
(от второй до последней записи на матрице) и pypy3
(не показано) в дополнение к версиям 2.5-3.6 на Python.
В то время как различные другие ответы предоставляют ярлыки, которые дают вам этот результат в конце, иногда полезно определить матрицу вручную. Затем вы можете определить конкретные вещи для отдельных сред в матрице. Например, вы можете определять зависимости только для одного окружения и избегать потери времени установки этой зависимости в каждой среде.
- python: 3.5
env: TOXENV=py35
- env: TOXENV=checkspelling
before_install: install_spellchecker.sh
- env: TOXENV=flake8
В приведенной выше матрице install_spellchecker.sh
script выполняется только для соответствующей среды, но не для других. Использовалась настройка before_install
(а не install
), так как использование параметра install
переопределило бы глобальный параметр install
. Однако если вы хотите (переопределить/заменить глобальные настройки), просто переопределите его в записи матрицы. Несомненно, различные другие настройки могут быть определены и для отдельных сред в матрице.
Ручное определение матрицы может обеспечить большую гибкость. Однако, если вам не нужна дополнительная гибкость, одна из нескольких ярлыков в других ответах упростит ваш файл конфигурации и будет легче читать и редактировать позже.
Ответ 4
TOXENV
переменная среды может использоваться для выбора подмножества тестов для каждой версии Python через указанную матрицу:
language: python
python:
- "2.7"
- "3.4"
- "3.5"
env:
matrix:
- TOXENV=py27-django-19
- TOXENV=py27-django-110
- TOXENV=py27-django-111
- TOXENV=py34-django-19
- TOXENV=py34-django-110
- TOXENV=py34-django-111
- TOXENV=py35-django-19
- TOXENV=py35-django-110
- TOXENV=py35-django-111
install:
- pip install tox
script:
- tox -e $TOXENV
В конфигурации "ток" укажите пропустить отсутствующие версии Python:
[tox]
skip_missing_interpreters=true