yml with tutorial travis started que how getting generate create python unit-testing travis-ci python-unittest tox

python - with - travis ci tutorial



Cómo ejecutar Tox con Travis-CI (4)

¿Cómo pruebas diferentes versiones de Python con Tox desde Travis-CI ?

Tengo un 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

que ejecuta mis pruebas de unidad de Python en varias versiones de Python y funciona perfectamente.

Quiero configurar una compilación en Travis-CI para ejecutar esto automáticamente cuando .travis.yml cambios a Github, así que tengo un .travis.yml :

language: python python: - "2.7" - "3.3" - "3.4" - "3.5" install: - pip install tox script: - tox

Esto parece funcionar técnicamente, pero ejecuta de manera redundante todas mis pruebas en cada versión de Python ... desde cada versión de Python. Así que una construcción que toma 5 minutos ahora toma 45 minutos.

Intenté eliminar la lista de python de mi archivo yaml, por lo que Travis solo ejecutará una única instancia de Python, pero eso hace que mis pruebas de Python3.5 fallen porque no se puede encontrar el intérprete 3.5. Aparentemente, esa es una limitación conocida, ya que Travis-CI no instalará Python3.5 a menos que especifique la versión exacta en su configuración ... pero no lo hace para las otras versiones.

¿Hay alguna manera de solucionar esto?


Para obtener más control y flexibilidad, puede definir manualmente su matriz de modo que la versión de Python y el entorno tox coincidan:

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

En caso de que no sea obvio, cada entrada en la matriz comienza en una línea que comienza con un guión ( - ). Todos los elementos que siguen a esa línea con sangría son líneas adicionales para ese único elemento.

Por ejemplo, todas las entradas, excepto la última, son dos líneas. la última entrada es solo una línea y no contiene una configuración de python ; por lo tanto, simplemente utiliza la versión predeterminada de Python (Python 2.7 según la documentación de Travis). Por supuesto, una versión específica de Python no es tan importante para esa prueba. Si desea ejecutar una prueba de este tipo contra Python 2 y 3 (una vez cada una), se recomienda usar las versiones que Travis instala de forma predeterminada (2.7 y 3.4) para que las pruebas se completen más rápidamente, ya que no es necesario. Instale una versión Python no estándar primero. Por ejemplo:

- python: 2.7 env: TOXENV=flake8 - python: 3.4 env: TOXENV=flake8

Lo mismo funciona con pypy (segunda a última entrada en la matriz) y pypy3 (no se muestra) además de las versiones 2.5-3.6 de Python.

Si bien las otras respuestas proporcionan accesos directos que le dan este resultado al final, a veces es útil definir la matriz manualmente. Luego puede definir cosas específicas para entornos individuales dentro de la matriz. Por ejemplo, puede definir dependencias para un solo entorno y evitar el tiempo perdido al instalar esa dependencia en cada entorno.

- python: 3.5 env: TOXENV=py35 - env: TOXENV=checkspelling before_install: install_spellchecker.sh - env: TOXENV=flake8

En la matriz anterior, el script install_spellchecker.sh solo se ejecuta para el entorno relevante, pero no para los demás. Se before_install configuración before_install (en lugar de install ), ya que el uso de la configuración de install habría invalidado la configuración de install global. Sin embargo, si eso es lo que quiere (para anular / reemplazar una configuración global), simplemente vuelva a definirla en la entrada de la matriz. Sin duda, también se podrían definir otras configuraciones para entornos individuales dentro de la matriz.

La definición manual de la matriz puede proporcionar mucha flexibilidad. Sin embargo, si no necesita la flexibilidad adicional, uno de los varios accesos directos en las otras respuestas mantendrá su archivo de configuración más simple y más fácil de leer y editar más adelante.


Por esto consideraría el uso de tox-travis. Este es un complemento que permite el uso de las múltiples versiones de Python de Travis CI y la capacidad de configuración completa de Tox. Para hacer esto, configurará el archivo .travis.yml para probar con Python:

sudo: false language: python python: - "2.7" - "3.4" install: pip install tox-travis script: tox

Esto ejecutará los testenvs apropiados, que son cualquier env declarado con py27 o py34 como factores del nombre por defecto. Py27 o py34 se utilizarán como alternativa si ningún entorno coincide con el factor dado.

Otras lecturas


Travis proporciona la versión de python para cada prueba como TRAVIS_PYTHON_VERSION , pero en la forma ''3.4'' , mientras que tox espera ''py34'' .

Si no quiere confiar en una lib externa (tox-travis) para hacer la traducción, puede hacerlo manualmente:

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 .)

Busca este patrón en un motor de búsqueda y encontrarás muchos proyectos usándolo.

Esto funciona también para pypy:

tox -e $(echo py$TRAVIS_PYTHON_VERSION | tr -d . | sed -e ''s/pypypy/pypy/'')

Fuente: .travis.yml de flask- .travis.yml .


TOXENV variable de entorno TOXENV se puede usar para seleccionar un subconjunto de pruebas para cada versión de Python a través de la matriz especificada:

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

En tox config especifique omitir las versiones faltantes de Python:

[tox] skip_missing_interpreters=true