はじめに
toxを使ってサクッと複数バージョンのPythonでテストを回します。
Anacondaとvirtualenvを使ってサクッとtoxが動く環境を作ります。
そしてたぶん、この手順がもっとも簡単にWindowsでtoxを使う方法かと思います。
手順
Anacondaをインストールする
手順は省略。
Python3.7をインストール
Anacondaをrootにvirtualenvをインストールする
Anacondaをインストールしたら conda
コマンドが使えるのでAnacondaをroot環境にvirtualenvを入れます。
ポイントとしては conda
コマンドでインストールすることです。
どうやら pip
ではうまくいきません。
$ conda install virtualenv
toxをインストール
toxをインストールします。
(py37)$ pip install tox
tox.iniを書く
toxの定義は tox.ini
というファイルで記載します。
とりあえずこんな感じで作ってみます。
[tox]
envlist =
py{36,37}
skip_missing_interpreters = true
[testenv]
description = Unit Test and Integration Test with coverages
passenv = LANG
deps =
pytest
pytest-cov
pytest-pythonpath
flake8
pep8
pyflakes
pytest-flake8
pytest-pep8
coverage
black
commands =
python setup.py install
coverage run --source=hogehoge -m pytest --junit-xml=test_results.xml
coverage report -m
coverage html
coverage xml
black hogehoge setup.py --check
-
envlist
にテストしたいPythonのバージョンを記載します。ここでは、3.7と3.6をテストする環境として定義してます。動きとしては -
skip_missing_interpreters
を有効にしておけば、指定したインタープリターに該当バージョンの仮想環境がない場合にもテストケースをスキップするだけでエラーとして扱わなくなります。CIとかに乗っけると手元の仮想環境と異なることが間々あるので結構便利だったりします。 -
[testenv]
のdeps
でテストランナーが必要とするライブラリをインストールします。今回はpytest
をテストランナー、カバレッジレポートはcoverage
で、コードのフォーマットチェックはblack
で行ってます。 -
commands
にテストのコマンドを記載すれば上から順番に実行します。 DBの用意など事前準備が必要だったり、後処理が必要な場合はそれぞれcommands_pre
commands_post
コマンドが用意されてますが、今回は使いません。 - tox.iniの詳しい解説は公式ドキュメントを見てください。
ちなみにpytest自体の設定は setup.cfg
に記載してます。 pep8
やflake8
の設定もここでしてます。
[tool:pytest]
addopts = -v -ra --pep8 --showlocals
log_cli = false
log_level = INFO
log_file_level = INFO
timeout = 5
python_paths = ./hogehoge ./hogehoge/utils
pep8ignore =
E501
tests/*.py ALL
[flake8]
max-line-length = 120
doctests = True
exclude =
.git
.eggs
__pycache__
tests/*.py
docs/
build/
dist/
toxで回すPythonのバージョンをあらかじめ用意する
このままでもtoxはうごきますが、Windowsでtoxを動かしたインタープリターのPythonバージョン以外の仮想環境が用意できず下記のようなエラーを吐いてしまいます。
GLOB sdist-make: /tmp/pyac/setup.py
py36 create: /tmp/pyac/.tox/py36
ERROR: InterpreterNotFound: python3.6
__________________________ summary ___________________________
ERROR: py36: InterpreterNotFound: python3.6
どうやら py36
が Python3.6を使って仮想環境を作れってことがWindowsさんはわからないらしい。。。
下記のように tox
が発見するパスに仮想環境を作る必要があるらしいです。
$ conda create -p C:\Python36 python=3.6
ほかにも、たとえばPython2.7の場合は
$ conda create -p C:\Python27 python=2.7
といった具合です。
toxする
toxするときは
$ tox
でOK。
ためしにtoxしたい人はtox.iniを書いた私のごみソースをcloneして手元で動かしてみましょう。
参考
Willem's Fizzy Logic—How to setup tox on Windows with Anaconda