nose とはなにか
今回は Python 用テストフレームワーク nose(http://code.google.com/p/python-nose/) の紹介をしたいと思います。
同種のソフトとしては py.test が知られており、実際、nose は py.test から大きな影響を受けています。
nose のインストール
それでは早速 nose をインストールしてみましょう。
easy_install を使うと、非常に簡単にインストールできます
$ easy_install nose
easy_install がインストールされていない場合は次の URL からインストールしてください
http://peak.telecommunity.com/DevCenter/EasyInstall
ソースコードからインストールする場合は、ダウンロードしてファイルを展開後、次のコマンドを実行します
$ python setup.py install
テストの書き方
unittest モジュールを使ってテストを作成する場合、必要なクラスを継承するなど、いくつかの決まりごとがあります。
import unittest
class TestFoo(unittest.TestCase):
def testCompare(self):
self.assert_(1==1)
if __name__ == '__main__':
unittest.main()
一方 nose では、正規表現 "(?:^|[b_.-])[Tt]est" にマッチしたクラス・関数が実行されるようになっているため、ルールがシンプルになっています。
# クラスでテストを書く
class TestFoo:
def testCompare(self):
assert 1==1
# 関数でテストを書く
def test_compare():
assert 1==1
テストの実行
テストの実行は次の2種類があります。
- nosetests コマンドでテスト対象のファイルやディレクトリを指定
- テストスクリプト内でテストを実行
(1) の場合は、nosetests の引数にテストファイルを指定、あるいは -w オプションでテストファイルを含んだディレクトリを指定することでテスト実行します。
$ nosetests -w tests
test.test_add ... ok
test_y.test_compare ... ok
----------------------------------------------------------------------
Ran 2 tests in 0.005s
OK
(2)の場合は、テストプログラム内で nose.main 関数を呼び出すようにします。
$ cat test_compare.py
def test_compare():
assert 1==1
if __name__ == '__main__':
import nose
nose.main()
$ python test_compare.py
test_compare.test_compare ... ok
----------------------------------------------------------------------
Ran 1 tests in 0.005s
OK
また、 (1), (2) いずれの場合も、 unittest モジュールで作成されたテストケースも自動的に実行されるようになっています。
nosetests の便利なオプション
-w 以外の便利なオプションについていくつか紹介したいと思います。
verbose モード
「-v」 オプションを有効にすると、verbose モードでテストが実行されます。-vvv のように v を重ねると、より verbose なメッセージが表示されます。pdb 対応
「--pdb」 オプションを有効にすると、テストプログラムで例外が起きると同時に、pdb が起動し、デバッグモードに入ります。
「--pdb-failures」オプションを有効にすると、テストプログラムでテストが失敗すると同時に、pdb が起動し、デバッグモードに入ります。
パターンマッチ
「-i 正規表現パターン」オプションを有効にすると、正規表現にマッチしたファイルのみがテスト実行されます。
「-e 正規表現パターン」オプションを有効にすると、逆に正規表現にマッチしたファイルは実行されなくなります。
まとめ
ここにあげたオプション以外にも、プラグインを書くことで doctest 対応など、機能を追加していくことも可能です。
独自プラグインを一度書いてみるというのはいかがでしょうか。