大まかな手順
- djangoのアプリケーションディレクトリ(module.pyのあるディレクトリ)にtests.pyを作成する。
- test.pyにunittest.TestCaseを継承したクラスを作成する。
- 作成したクラスに"test〜"と名のつくメソッドを定義して、その中でテストを記述。
- "manage.py test <アプリケーション名>"とコマンドを打つ。
とまあ、簡単に書けばこんなところ。もっといろいろできるみたいですが。
詳細は、以下を参照のこと。
http://djangoproject.jp/doc/ja/1.0/topics/testing.html
で、これだけだとtest"s".py(test.pyにしてハマった…)に、大量のテストを記述しなきゃいけないじゃん!と思いますよね。他にも、PyUnitとして実行できないの?とか疑問は出てきますよね。
tests.pyに大量のテストを記述しなきゃいけない?
djangoのドキュメントに書いてあるんですが、以下の方法で回避できます。
JUnitのTestSuiteクラスと同じく、unittest.TestSuiteなるクラスで割りと簡単に。
- tests.pyにsuite()メソッドを作成する。(最初に作成したTestCaseクラスにsuite(self)をつくるのではありません!クラスのインスタンスメソッドではなく、モジュールの静的メソッド<?こういう言い方でいいの?>でつくるのです。それにつくったメソッドをそのままクラスの外にコピペして、引数にselfを残してはいけません!引数は空です!……そう、これにもハマリました。)
- 適当なパッケージを作成して、そこにunittest.TestCaseを継承したクラスを作成する。(例えばアプリケーション名が"polls"だった場合、ディレクトリは"polls.tests"とかに作成………してはいけません!"tests"っていうディレクトリをつくったら、tests.pyと名前が被るでしょ!これに一番ハマった。なんてマヌケなハマリだろう)
- tests.pyのsuite()メソッドでは、unittest.makeSuite(クラス, 'prefix')メソッドで簡単にTestSuiteを作成してくれます。具体的には、以下のような記述になります。("return suite"を忘れないようにね!)
import unittest
def suite():
suite = unittest.makeSuite(SampleTest, 'test')
return suite
実行は、先ほどのとおり"python manage.py test <アプリケーション名>"です。
PyUnitとして実行できないの?
そのままでは動きません。models.pyに記述されているモデルクラスをimportしているモジュールを実行する場合に、settings.pyに書かれている設定が無いよといった旨のエラーが出てきます。回避手段はあるようですが、それはまた別の機会に調べてみます。
以上、たまたまこの記事を読んでくださった方がいたら、こんなマヌケなハマリはしないようご注意を!