kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

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'...

成功