pytest-xdist プラグインは、独自のテストモードで py.test を拡張します:
リモート環境でテストを実行する前に、 py.test はプログラムのソースコードをリモートマシンへ効率的に “rsync” します。全てのテスト結果は、ローカルマシンのターミナル上で表示されます。異なる Python バージョンやインタープリターも指定できます。
プラグインをインストールします:
easy_install pytest-xdist
# または
pip install pytest-xdist
もしくは pytest-xdist リポジトリ からチェックアウトして develop コマンドでパッケージを使います:
python setup.py develop
複数の CPU でテストを行うには、次のように実行します:
py.test -n NUM
特に長時間実行されるテスト、またはたくさんの I/O を必要とするテストの速度向上が見込めます。
Python 2.4 の subprocess をインスタンス化するには、そこにテストを送り、次のように実行します:
py.test -d --tx popen//python=python2.4
システムのバイナリ検索パスで見つけた “Python 2.4” インタープリターで実行するサブプロセスを開始します。
次のように –tx オプションに値を指定する場合:
py.test -d --tx 3*popen//python=python2.4
3つのサブプロセスが作成され、その3つのサブプロセスにテストが分散されて並行で実行されます。
中規模または大規模のテストスイートをもつプロジェクトをリファクタリングするために、looponfailing モードが便利です。単純に --f オプションを追加します:
py.test -f
py.test はテストを実行します。ここで実行したテストに失敗すると仮定して、ファイルの更新を待ってからその失敗したテストを再実行します。ファイルの更新は looponfailingroots というルートディレクトリとその全てのコンテンツを (再帰的に) 調べることで検出されます。このデフォルト値が意図したように作用しないなら、設定オプションを追加することで自分のプロジェクト向けの値を変更できます:
# pytest.ini, setup.cfg または tox.ini ファイルの内容
[pytest]
looponfailroots = mypkg testdir
この設定は ini ファイルがあるディレクトリからみて、相対パスで指定したディレクトリのファイルの更新のみを調べるようにします。
ローカルで正常に実行できるテストを含む mypkg と、ssh でログインできるマシン myhost もあると仮定します。次のように実行してアドホックに分散テストを実行できます:
py.test -d --tx ssh=myhostpopen --rsyncdir mypkg mypkg
これはリモートの ssh アカウントで mypkg パッケージのディレクトリを同期させ、リモートマシン上でテストを実行します。
リモートマシンへ送るために 複数の --rsyncdir ディレクトリを指定できます。
socketserver.py という単一モジュールの Python プログラムをダウンロードし、次のように実行してください:
python socketserver.py
このプログラムはデフォルトのポートで待機状態を起動します。自宅のマシン上で、何かのパッケージと一緒にこの新たなソケットホストを指定できます:
py.test -d --tx socket=192.168.1.102:8888 --rsyncdir mypkg mypkg
複数のプラットフォームでテストを実行する基本的なコマンドです:
py.test --dist=each --tx=spec1 --tx=spec2
Windows ホスト、OSX ホスト、Linux 環境を指定する場合、このコマンドはそれぞれのテストを全てのプラットフォームに送信します。そして、全てのプラットフォームから同時に失敗レポートを受け取ります。この設定には xspec 構文 を使います。
pytest (バージョン 2.0) は ini スタイルの設定ファイルに対応しています。例えば、デフォルトで3つのサブプロセスを使ってテストを実行させます:
[pytest]
addopts = -n3
次のようにしてデフォルト環境も追加できます:
[pytest]
addopts = --tx ssh=myhost//python=python2.5 --tx ssh=myhost//python=python2.6
そして、次のように入力して実行すると:
py.test --dist=each
それぞれの環境でテストが実行されます。
プロジェクトのルートディレクトリに tox.ini か setup.cfg ファイルを置き、同期に含める、または除外するディレクトリを指定することもできます:
[pytest]
rsyncdirs = . mypkg helperpkg
rsyncignore = .hg
ここで設定されるディレクトリは、設定ファイルの場所から相対パスでディレクトリを指定します。