Search code examples
pythondjangodatabasetestcase

Creating multiple test databases in Django TestCases


I wanted to create multiple test databases, so I could check if my synchronizing script is working properly. I have added them to Django settings like this:

DATABASES = {
"default": {
    "ENGINE": env.str("DB_ENGINE"),
    "NAME": env.str("name[1]"),
    "USER": env.str("DB_USER"),
    "PASSWORD": env.str("DB_PASSWORD"),
    "HOST": env.str("DB_HOST"),
    "PORT": env.str("DB_PORT"),
    "TEST":
        {
            "NAME": 'name[1]',
        }
},
"name[2]": {
    "ENGINE": env.str("DB_ENGINE"),
    "NAME": "[name1]",
    "USER": env.str("DB_USER"),
    "PASSWORD": env.str("DB_PASSWORD"),
    "HOST": env.str("DB_HOST"),
    "PORT": env.str("DB_PORT"),
    "TEST":
        {
            "NAME": "name[2]",
        }
},
"name[3]": {
    "ENGINE": env.str("DB_ENGINE"),
    "NAME": "name[3]",
    "USER": env.str("DB_USER"),
    "PASSWORD": env.str("DB_PASSWORD"),
    "HOST": env.str("DB_HOST"),
    "PORT": env.str("DB_PORT"),
    "TEST":
        {
            "NAME": "name[3]",
        }
},
}

This is how my test for sake of testing looks like:

class SyncTestCase(TestCase):

def setUp(self) -> None:
    self.client = Client()

def test_func_tester_client(self):
    bitbucket_db_setup.main()
    response = self.client.get("/v1/devices/?name=a", SERVER_PORT=8000)
    print(response.content)
    self.assertEqual(200, 200)

But when I run it, it only creates DB for 'default' alias:

Creating test database for alias 'default'...

*DB_SMTH are imported names from environment and name[x] are just names


Solution

  • To create those DB's while running tests we need to add a set with names of databases from Django settings. We should add those that we wish to use while testing, at the beggining of TestCase:

    class SyncTestCase(TestCase):
        databases = {'name[1]', 'name[2]', 'name[3]'}
    ...
    

    Link from Django documentation: https://docs.djangoproject.com/en/3.2/topics/testing/tools/#testing-multi-db