目次

前のトピックへ

モンキーパッチ/モックのモジュールと環境

次のトピックへ

一時ディレクトリとファイル

xdist: pytest の分散テストプラグイン

pytest-xdist プラグインは、独自のテストモードで py.test を拡張します:

  • Looponfail: サブプロセスでテストを繰り返し実行します。各テストを実行してから py.test はプロジェクト内のファイルが変更されるまで待ち、事前に失敗したテストのみを再実行します。この動作は全てのテストが成功するまで繰り返されます。この段階になって再度、全てのテストを実行します。
  • マルチプロセス負荷分散: 複数 CPU または複数ホストがある場合、それらを結合テストの実行に使います。これにより開発を高速化したり、リモートマシンの特別なリソースを使ったりします。
  • マルチプラットフォームのカバレッジ: 異なる Python インタープリター、または異なるプラットフォームを指定して、全ての環境で並行してテストを実行します。

リモート環境でテストを実行する前に、 py.test はプログラムのソースコードをリモートマシンへ効率的に “rsync” します。全てのテスト結果は、ローカルマシンのターミナル上で表示されます。異なる Python バージョンやインタープリターも指定できます。

xdist プラグインのインストール

プラグインをインストールします:

easy_install pytest-xdist

# または

pip install pytest-xdist

もしくは pytest-xdist リポジトリ からチェックアウトして develop コマンドでパッケージを使います:

python setup.py develop

使用例

複数の CPU を使ったテスト実行の高速化

複数の CPU でテストを行うには、次のように実行します:

py.test -n NUM

特に長時間実行されるテスト、またはたくさんの I/O を必要とするテストの速度向上が見込めます。

Python のサブプロセスでテスト実行

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 モードでのテスト実行

中規模または大規模のテストスイートをもつプロジェクトをリファクタリングするために、looponfailing モードが便利です。単純に --f オプションを追加します:

py.test -f

py.test はテストを実行します。ここで実行したテストに失敗すると仮定して、ファイルの更新を待ってからその失敗したテストを再実行します。ファイルの更新は looponfailingroots というルートディレクトリとその全てのコンテンツを (再帰的に) 調べることで検出されます。このデフォルト値が意図したように作用しないなら、設定オプションを追加することで自分のプロジェクト向けの値を変更できます:

# pytest.ini, setup.cfg または tox.ini ファイルの内容
[pytest]
looponfailroots = mypkg testdir

この設定は ini ファイルがあるディレクトリからみて、相対パスで指定したディレクトリのファイルの更新のみを調べるようにします。

リモートの SSH アカウントへテストを送信

ローカルで正常に実行できるテストを含む 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 構文 を使います。

Ini ファイルでテスト実行環境の指定

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

それぞれの環境でテストが実行されます。

ini ファイルで “rsync” ディレクトリの指定

プロジェクトのルートディレクトリに tox.inisetup.cfg ファイルを置き、同期に含める、または除外するディレクトリを指定することもできます:

[pytest]
rsyncdirs = . mypkg helperpkg
rsyncignore = .hg

ここで設定されるディレクトリは、設定ファイルの場所から相対パスでディレクトリを指定します。