大まかな手順

  1. djangoのアプリケーションディレクトリ(module.pyのあるディレクトリ)にtests.pyを作成する。
  2. test.pyにunittest.TestCaseを継承したクラスを作成する。
  3. 作成したクラスに"test〜"と名のつくメソッドを定義して、その中でテストを記述。
  4. "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なるクラスで割りと簡単に。

  1. tests.pyにsuite()メソッドを作成する。(最初に作成したTestCaseクラスにsuite(self)をつくるのではありません!クラスのインスタンスメソッドではなく、モジュールの静的メソッド<?こういう言い方でいいの?>でつくるのです。それにつくったメソッドをそのままクラスの外にコピペして、引数にselfを残してはいけません!引数は空です!……そう、これにもハマリました。)
  2. 適当なパッケージを作成して、そこにunittest.TestCaseを継承したクラスを作成する。(例えばアプリケーション名が"polls"だった場合、ディレクトリは"polls.tests"とかに作成………してはいけません!"tests"っていうディレクトリをつくったら、tests.pyと名前が被るでしょ!これに一番ハマった。なんてマヌケなハマリだろう)
  3. 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に書かれている設定が無いよといった旨のエラーが出てきます。回避手段はあるようですが、それはまた別の機会に調べてみます。


以上、たまたまこの記事を読んでくださった方がいたら、こんなマヌケなハマリはしないようご注意を!