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