🧪
Djangoのモデルにおける汎用テスト観点
はじめに
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)
説明
-
field1
をnull=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に対する基本的なテスト観点を紹介しました。これらの観点を理解し、実装することで、データの正しさを保証し、バグの少ないアプリケーションを構築することができます。
Discussion