複数の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を指定する必要はありません。