Python用テストフレームワークnose (1) :: 幕の内 - CMS - コンテンツマネジメントシステム

Python用テストフレームワークnose (1)

nose はテストケース作成の手間、テスト実行のわずらわしさを軽減することを狙いにしたテストフレームワークで、同種のソフトとしては py.test が知られています。

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種類があります。

  1. nosetests コマンドでテスト対象のファイルやディレクトリを指定
  2. テストスクリプト内でテストを実行

(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 対応など、機能を追加していくことも可能です。

独自プラグインを一度書いてみるというのはいかがでしょうか。

最終更新日: 2007/03/29
日本語全文検索KabayakiBOX 日本語全文検索KABAYAKI コミュニケーションポータル オープンソースウェブ ウェブフレームワークKahua オンライン出版サイトKarretta
本サイト上で記載されている製品名および商品名は、それぞれの会社の商標または登録商標です。
幕の内 (R) は Time Intermedia Corporation の登録商標です。
Python用テストフレームワークnose (1) :: 幕の内 - CMS - コンテンツマネジメントシステム