Djangoチュートリアル(10) 自動テスト
はじめての Django アプリ作成、その 5 | Django ドキュメント | Djangoに進む
自動テストの話
Webアプリって要はGETなりPOSTを受け取ってHTML文字列を返す関数の集まりみたいな
ものだからGUIのデスクトップアプリとかよりはテストと相性いい気はする
画面の細かい所までチェックするとなれば同じだと思うけど
でもフレームワークが自動テストをサポートしてくれるっていうとどんな感じなのか
Django を開発した Jacob Kaplan-Moss は次の言葉を残しています。「テストのないコードは、デザインとして壊れている。」
へー
それは当然Djangoの思想ってことだよね
それはDjango自身にも適用されてるだろうし
Django上のアプリでもそうしやすいようになっているわけだなきっと
polls/tests.py
unittestっぽい書き方
Django特有で便利な機能が拡張されていると思うけど
import datetime
from django.utils import timezone
from django.test import TestCase
from .models import Question
class QuestionModelTests(TestCase):
def test_was_published_recently_with_future_question(self):
time = timezone.now() + datetime.timedelta(days=30)
future_question = Question(pub_date=time)
self.assertIs(future_question.was_published_recently(), False)
まだHTML文字列以前だった
順番からしてこういうのからにならざるを得ないかな
これは失敗する
$ python manage.py test polls
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
F
...
FAILED (failures=1)
Destroying test database for alias 'default'...
何やらデータベースを作ってくれているっぽいな
失敗してるコードはこれ
def was_published_recently(self):
return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
これを入力したときなんの疑問も抱かなかったのは若干悔しいとも言う
でも未来の時刻が入ってるとも思わないしなあ
修正
def was_published_recently(self):
now = timezone.now()
return now - datetime.timedelta(days=1) <= self.pub_date <= now
$ python manage.py test polls
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
.
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
Destroying test database for alias 'default'...
成功