【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)
実行結果
こんな感じで出力されます。
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と分けると良いと思います。
まとめ
ドキュメントを見ましょう。