複数バージョンのPythonでのテスト

最近 pyroonga というPythonから groonga が操作できるようなものを作り始めたのですが、作るにあたってサポートするPythonのバージョンを2.6、2.7、3.xに決めました。

そこで問題になるのがテストです。複数バージョンでテストしないといけないので、virtualenvあたりを使うんですが、いちいちバージョンを切り替えてテストを走らせるのがめんどくさいです。

で、そのためのツールに tox というものがあります。これを使うと複数バージョンでのテストがコマンド一発で済みます。

前提条件として、テストに使用するバージョンのPythonがシステムにインストールされている必要があります。 まぁ普通のPythonistaならPython2.6、2.7、3.2ぐらいは当然入れていると思いますので問題ないでしょう。

インストール

pipまたはeasy_installを使ってpypiからインストールできます。

% pip install tox

or

% easy_install tox

使い方とか

例として以下のようなディレクトリ構成になっているとします。

ディレクトリ構成:

.
|-- example
|   |-- __init__.py
|   `-- tests
|       |-- __init__.py
|       `-- test_example.py
|-- setup.py
`-- tox.ini

toxを使用するにはsetup.pyが必要なので、適当に用意してください。

tox.ini はsetup.pyと同じディレクトリに置きます。

# tox.ini
[tox]
envlist = py26,py27,py32

[testenv]
deps = nose
commands = nosetests []

envlist がテストに使用するPythonのバージョンです。前述の通り、既にシステムにインストールされている必要があります。pypyやjythonも指定できたりします。

deps はテストに必要なパッケージを指定できます。ここに書いたものはtoxが自動的にpypiから持ってきてくれます。

commands にテストを実行するコマンドを書きます。 [] にはtoxを実行するときの引数が入ります。

以下のコマンドでtoxを実行します。

% tox

nosetestsに引数を渡してやりたい場合は

% tox --with-doctest

これで、tox.ini と同じディレクトリに .tox というディレクトリに envlist で指定した各バージョンのvirtualenvが構成されてテストが走ります。

特定のバージョンのテストだけ実行したい場合は -e オプションを付けて

% tox -e py26

とします。

テストが実行された後は、どのバージョンでテストが失敗したかなどが分かります。

% tox
_____________ [tox sdist] _____________
...

____________ [tox summary] ____________
[TOX] ERROR: py26: commands failed
[TOX] py27: commands succeeded
[TOX] py32: commands succeeded
%

さらに詳しく知りたい場合は公式サイト http://tox.testrun.org/latest/ を見てみてください。