Travis-CI 内から Tox を使用したさまざまなPythonバージョンをテストするにはどうすればよいですか?
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ユニットテストをいくつかの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分かかります。
私はyamlファイルからpython
リストを削除してみたので、Travisは単一のPython=インスタンスのみを実行しますが、3.5インタープリターが見つかりません。明らかに、それは 既知の制限 です。構成で正確なバージョンを指定しない限り、Travis-CIはPython3.5をインストールしないためです...しかし、それは他のバージョン。
これを回避する方法はありますか?
このため、私はtox-travisの使用を検討します。これは、Travis CIの複数のpythonバージョンとToxの完全な構成可能性を使用できるようにするプラグインです。これを行うには、Pythonでテストするように.travis.ymlファイルを構成します。
Sudo: false
language: python
python:
- "2.7"
- "3.4"
install: pip install tox-travis
script: tox
これにより、デフォルトで名前の要素としてpy27またはpy34を使用して宣言された環境である適切なtestenvが実行されます。指定された要素に一致する環境がない場合、Py27またはpy34がフォールバックとして使用されます。
より多くの制御と柔軟性のために、マトリックスを手動で定義して、Pythonバージョンとtox環境が一致するようにすることができます。
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
はっきりしない場合、マトリックスの各エントリはハイフン(-
)で始まる行から始まります。インデントされているその行に続く項目は、その単一の項目の追加の行です。
たとえば、最後のエントリを除くすべてのエントリは2行です。最後のエントリは1行のみで、python
設定は含まれていません。したがって、デフォルトのPythonバージョン(TravisドキュメントによるとPython 2.7)を使用します。もちろん、特定のPythonバージョンはそのためそれほど重要ではありません。 test。Python 2 and 3(once one))の両方に対してこのようなテストを実行したい場合は、Travisがデフォルトでインストールするバージョン(2.7および3.4)を使用して、非標準のPythonバージョンを最初にインストールする必要がないため、テストはより迅速に完了します。次に例を示します。
- python: 2.7
env: TOXENV=flake8
- python: 3.4
env: TOXENV=flake8
Pythonバージョン2.5-3.6に加えて、pypy
(マトリックスの最後から2番目のエントリ)およびpypy3
(表示されていません)でも同様に機能します。
他のさまざまな答えは、最終的にこの結果をもたらすショートカットを提供しますが、マトリックスを手動で定義すると役立つ場合があります。次に、マトリックス内の個々の環境に特定のものを定義できます。たとえば、単一の環境にのみ依存関係を定義して、その依存関係をすべての環境にインストールする無駄な時間を回避できます。
- python: 3.5
env: TOXENV=py35
- env: TOXENV=checkspelling
before_install: install_spellchecker.sh
- env: TOXENV=flake8
上記のマトリックスでは、install_spellchecker.sh
スクリプトは関連する環境でのみ実行され、他の環境では実行されません。 install
設定を使用すると、グローバルinstall
設定が上書きされるため、before_install
設定が使用されました(install
ではなく)。ただし、それが(グローバル設定をオーバーライド/置換するために)必要な場合は、マトリックスエントリで再定義するだけです。間違いなく、マトリックス内の個々の環境に対して他のさまざまな設定を定義することもできます。
マトリックスを手動で定義すると、柔軟性が大幅に向上します。ただし、柔軟性を追加する必要がない場合は、他の回答にあるさまざまなショートカットのいずれかを使用すると、構成ファイルがシンプルになり、後で読みやすく、編集しやすくなります。
Travisは各テストのpythonバージョンをTRAVIS_PYTHON_VERSION
としてバージョンを提供しますが、'3.4'
の形式で提供しますが、tox
は'py34'
を期待します。
翻訳を行うために外部lib(tox-travis)に依存したくない場合は、手動で変換できます。
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 。
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
Tox configで、欠落しているバージョンのPythonをスキップするように指定します。
[tox]
skip_missing_interpreters=true