複数のdb設定を持つdjangoアプリのテストはmulti_db=Trueを指定する
以前、djangoで複数DBを扱う場合についてエントリを書きました。
テストについて注意することがあったのでメモしておきます。
複数dbを扱う場合は設定ファイルに以下の様に複数定義します。
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': 'default.db', 'USER': '', 'PASSWORD': '', 'HOST': '', 'PORT': '', }, 'another': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': 'another.db', 'USER': '', 'PASSWORD': '', 'HOST': '', 'PORT': '', } }
このようなモデルがあるとします。
from django.db import models class Book(models.Model): title = models.CharField(max_length=255) price = models.IntegerField() author = models.CharField(max_length=255) published_at = models.DateTimeField()
1つめのdbにデータを保存する場合、このテストは正しく動きます
from datetime import datetime from django.test import TestCase from apps.models import Book class SimpleTest(TestCase): def setUp(self): Book.objects.create(title="python book", author="someone", price=1580, published_at=datetime.now()) def test_book_count(self): self.assertEquals(Book.objects.all().count(), 1) def test_book_count2(self): self.assertEquals(Book.objects.all().count(), 1)
一方、2つめ以降のdbを使用するとテストは失敗するようになります。
from datetime import datetime from django.test import TestCase from apps.models import Book class SimpleTest(TestCase): def setUp(self): Book.objects.using('another').create(title="python book", author="someone", price=1580, published_at=datetime.now()) def test_book_count(self): self.assertEquals(Book.objects.using('another').all().count(), 1) def test_book_count2(self): self.assertEquals(Book.objects.using('another').all().count(), 1)
File "/path/to/project/apps/tests.py", line 18, in test_book_count2 self.assertEquals(Book.objects.using('another').all().count(), 1) AssertionError: 2 != 1
理由は2つめ以降のdbはtest_***毎にクリアされないからです。
すべてのdbをクリアさせるためには、multi_db = Trueを指定する必要があります。
from datetime import datetime from django.test import TestCase from apps.models import Book class SimpleTest(TestCase): multi_db = True def setUp(self): Book.objects.using('another').create(title="python book", author="someone", price=1580, published_at=datetime.now()) def test_book_count(self): self.assertEquals(Book.objects.using('another').all().count(), 1) def test_book_count2(self): self.assertEquals(Book.objects.using('another').all().count(), 1)
dbを使わないテストの場合はmulti_db = Trueを指定する必要はありません。