2016-05-04 33 views
14

Come testare diverse versioni Python con Tox da Travis-CI?Come eseguire Tox con Travis-CI

ho 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 

che gestisce i miei Unittests Python in varie versioni di Python e funziona perfettamente.

Voglio installare una build in Travis-CI per eseguire automaticamente questo quando spingo modifiche Github, quindi ho un .travis.yml:

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

Questo sembra tecnicamente funzionare, ma funziona in modo ridondante tutta la mia prova in ogni versione di Python ... da ogni versione di Python. Quindi una build che impiega 5 minuti richiede ora 45 minuti.

Ho provato a rimuovere l'elenco python dal mio file yaml, quindi Travis eseguirà solo una singola istanza Python, ma questo causa il fallimento dei test di Python3.5 perché non è possibile trovare l'interprete 3.5. Apparentemente, questo è un known limitation come Travis-CI non installerà Python3.5 a meno che non si specifichi quella versione esatta nella propria configurazione ... ma non lo fa per le altre versioni.

C'è un modo per risolvere il problema?

risposta

17

Per questo vorrei prendere in considerazione l'utilizzo di tox-travis. Questo è un plugin che consente l'uso delle versioni multiple di Python di Travis CI e la piena configurabilità di Tox. Per fare questo è configurare il file .travis.yml di testare con Python:

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

Questo farà eseguire i testenvs appropriate, che sono ogni ENV dichiarato con py27 o py34 come fattori del nome di default. Py27 o py34 saranno usati come fallback se nessun ambiente corrisponde al fattore specificato.

Further Reading

6

Travis fornisce la versione pitone per ogni test come TRAVIS_PYTHON_VERSION, ma nella forma '3.4', mentre tox aspetta 'py34'.

Se non si vuole fare affidamento su un lib esterno (tox-Travis) per fare la traduzione, è possibile farlo 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 .) 

Cerca nel modello in un motore di ricerca e ti trova molti progetti che lo utilizzano.

Questo funziona per PyPy così:

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

Fonte: .travis.yml pallone-mongoengine.

3

TOXENV variabile ambiente può essere utilizzato per selezionare sottoinsieme di test per ciascuna versione di Python tramite matrice specificata:

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 

In tox configurazione specifica per saltare versioni mancanti di Python:

[tox] 
skip_missing_interpreters=true 
8

Per più controllo e flessibilità è possibile definire manualmente la matrice in modo che la versione di Python e l'ambiente tox corrispondano:

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 

Nel caso non sia ovvio, ogni voce nella matrice inizia su una riga che inizia con un trattino (-). Tutti gli elementi che seguono quella linea rientrata sono linee aggiuntive per quel singolo oggetto.

Ad esempio, tutte le voci tranne l'ultima sono due righe. l'ultima voce è solo una riga e non contiene un'impostazione python; pertanto, utilizza semplicemente la versione predefinita di Python (Python 2.7 secondo la documentazione di Travis). Naturalmente, una specifica versione di Python non è così importante per quel test. Se si desidera eseguire tale test sia con Python 2 che con 3 (una volta ciascuno), si consiglia di utilizzare le versioni di Travis installate per impostazione predefinita (2.7 e 3.4) in modo che i test vengano completati più rapidamente in quanto non è necessario installare prima una versione Python non standard. Ad esempio:

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

Le stesse opere con pypy (secondo all'ultimo risultato della matrice) e pypy3 (non mostrato) in aggiunta alle versioni Python 2.5-3.6.

Mentre le varie altre risposte forniscono scorciatoie che danno questo risultato alla fine, a volte è utile definire la matrice manualmente. Quindi puoi definire cose specifiche per i singoli ambienti all'interno della matrice. Ad esempio, è possibile definire le dipendenze solo per un singolo ambiente ed evitare lo spreco di tempo installando tale dipendenza in ogni ambiente.

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

Nella matrice sopra, lo script install_spellchecker.sh viene eseguito solo per l'ambiente in questione, ma non gli altri. È stata utilizzata l'impostazione before_install (anziché install), poiché l'utilizzo dell'impostazione install avrebbe annullato l'impostazione globale install. Tuttavia, se questo è ciò che si desidera (per sovrascrivere/sostituire un'impostazione globale), basta ridefinirlo nella voce della matrice. Senza dubbio, è possibile definire varie altre impostazioni per i singoli ambienti all'interno della matrice.

La definizione manuale della matrice può fornire molta flessibilità. Tuttavia, se non hai bisogno di una maggiore flessibilità, una delle varie scorciatoie nelle altre risposte manterrà il tuo file di configurazione più semplice e facile da leggere e modificare in seguito.