hikaru’s diary

Django Engineer

【Django】テストを書く

ドキュメント
はじめての Django アプリ作成、その 5 | Django ドキュメント | Django
Django におけるテスト | Django ドキュメント | Django


ドキュメントでは「なぜテストが必要なのか?」まで詳しく説明されています。
Djangoを使ってない方でもぜひ見てください。

引っかかった点
先に引っかかった点を紹介します。
テストを開始する際にtest_(データベース名)というデータベースが作成されます。
ただしこのデータベースは空なのですでに入っているデータを使いたい場合はデータベースを用意し--keepdbを付けたりしましょう。
参考(テストを書いて実行する | Django ドキュメント | Django
また、settings.pyのdatabaseの設定で'TEST': { 'MIRROR': 'default',}と付け加えてもテストできます。
複数のデータベースを使用してテストする際はこの方法でないとうまくいかないっぽいです。
参考(Advanced testing topics | Django ドキュメント | Django


test_から始まる関数名にしないとテストを実施してくれません。


a=1のテスト例

tests.py

from django.test import TestCase
class test_prac(TestCase):

    def test_prac(self):
        a = 1
        self.assertEqual(a, 1)

実行結果
f:id:hikaru2323:20220210192157p:plain

こんな感じで出力されます。

viewsなどのテスト例

from django.test import TestCase
from django.urls import reverse, resolve
from diary.models import Test #diaryはアプリ名
from diary.views import Test, main
from diary.forms import TestForm


# FormTest
class FormTests(TestCase):

    def test_form(self):
        params = {'name': '山田 太郎 ',year: 2022}
        form = TestForm(params)
        self.assertTrue(form.is_valid())

# ModelTest
class ModelTests(TestCase):

    def test_Model(self):
        saved_posts = table.objects.all()
        self.assertEqual(saved_posts.count(), 0)

# UrlsTest
class UrlsTests(TestCase):
    # index ページへのURLでアクセスする時のリダイレクトをテスト
    # ここにurlを書く
    list1 = [['/diary/main/', main.main],]

    for i in range(len(list1)):
        def test_url(self):
            i = UrlsTests.i
            view = resolve(UrlsTests.list1[i][0])
            self.assertEqual(view.func, UrlsTests.list1[i][1])

# ViewTest
class ViewTests(TestCase):
    def test_different_name(self):
        response = self.client.get(reverse('kinmu'))
        self.assertEqual(response.status_code, 200)

self.assertEqual関数などについてはここから見れます。
unittest — Unit testing framework — Python 3.10.2 documentation



テストの分け方

テストの数が数百個以上になるとファイルを分けた方が管理しやすいです。(ちなみに私は5個しか書けてない)
tests.pyをmodels_test.py~forms_test.pyと分けると良いと思います。


まとめ
ドキュメントを見ましょう。