Подтвердить что ты не робот

Как запустить 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, если вы не укажете точную версию в своей конфигурации... но это не делает этого для других версий.

Есть ли способ, которым я могу это решить?

4b9b3361

Ответ 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