🧪

Djangoのモデルにおける汎用テスト観点

2025/02/02に公開

はじめに

DjangoでModelに対するテストを行う際、よく使われるであろう、テスト観点をまとめました。

テスト環境の準備

Djangoのテストを実施する際には、django.test.TestCase を継承したテストクラスを作成し、データベースのセットアップを行います。

setUp

from django.test import TestCase
from myapp.models import MyModel

class MyModelTestCase(TestCase):
    def setUp(self):
        self.instance = MyModel.objects.create(field1="test", field2=123)

説明

  • setUp メソッドは、各テストメソッドの実行前に実行される。
  • 必要なデータを作成し、各テストで利用できるようにする。
  • objects.create() は新しいオブジェクトをデータベースに保存し、作成されたオブジェクトを返す。

テスト観点

観点1. データの挿入ができていること

    def test_create_data(self):
        obj = MyModel.objects.create(field1="example", field2=456)
        self.assertIsNotNone(obj.id)

説明

  • create メソッドを使用して新しいデータを作成。
  • id フィールドが None でないことを確認し、正常に保存されたことを保証する。
  • assertIsNotNone(obj.id) は、id フィールドが None ではないことを検証するためのユニットテスト用関数。

観点2. データの参照ができること

    def test_retrieve_data(self):
        obj = MyModel.objects.get(id=self.instance.id)
        self.assertEqual(obj.field1, "test")

説明

  • get メソッドでデータを取得し、期待する値が正しいか確認。
  • assertEqual(obj.field1, "test") は、obj.field1 の値が "test" であることを検証する。

観点3. 存在しないデータを参照したとき、404エラーを返す

    from django.core.exceptions import ObjectDoesNotExist
    
    def test_retrieve_nonexistent_data(self):
        with self.assertRaises(ObjectDoesNotExist):
            MyModel.objects.get(id=999)

説明

  • 存在しない id=999 のデータを取得しようとすると ObjectDoesNotExist 例外が発生することを確認。
  • assertRaises(ObjectDoesNotExist) は、指定した例外が発生することを検証するためのテスト関数。

観点4. データ削除後、そのデータを参照できないこと

    def test_delete_data(self):
        self.instance.delete()
        with self.assertRaises(ObjectDoesNotExist):
            MyModel.objects.get(id=self.instance.id)

説明

  • delete メソッドでデータを削除し、その後取得しようとすると例外が発生することを確認。
  • assertRaises(ObjectDoesNotExist) を使用し、データが取得できないことを確認する。

観点5. 更新したデータが反映されること

    def test_update_data(self):
        self.instance.field1 = "updated"
        self.instance.save()
        updated_obj = MyModel.objects.get(id=self.instance.id)
        self.assertEqual(updated_obj.field1, "updated")

説明

  • save メソッドでデータを更新し、取得した値が変更後の値と一致するか確認。
  • assertEqual(updated_obj.field1, "updated") で、フィールドの値が正しく変更されたことを検証。

観点6. 一意制約が適切であること

    from django.db.utils import IntegrityError

    def test_unique_constraint(self):
        with self.assertRaises(IntegrityError):
            MyModel.objects.create(field1="test", field2=123)

説明

  • field1 などに unique=True の制約がある場合、同じ値でデータを作成すると IntegrityError になることを確認。
  • assertRaises(IntegrityError) で、一意制約の違反が適切に検出されることを検証。

観点7. Nullに対する扱いが適切であること

    def test_null_field(self):
        obj = MyModel.objects.create(field1=None, field2=789)
        self.assertIsNone(obj.field1)

説明

  • field1null=True に設定している場合、None を指定してデータを作成できることを確認。
  • assertIsNone(obj.field1) で、値が None であることを検証。

観点8. デフォルト値が正しく設定されること

    def test_default_value(self):
        obj = MyModel.objects.create(field2=111)
        self.assertEqual(obj.field1, "default_value")

説明

  • モデルフィールドに default を設定している場合、未指定の際に正しくデフォルト値が適用されるか確認。
  • assertEqual(obj.field1, "default_value") で、デフォルト値が正しく設定されていることを検証。

まとめ

このドキュメントでは、DjangoのModelに対する基本的なテスト観点を紹介しました。これらの観点を理解し、実装することで、データの正しさを保証し、バグの少ないアプリケーションを構築することができます。


参考資料

Django公式ドキュメント - テスト

Discussion