Django does not automatically create test database
I have a Django
project, version - 3.2.25
. The problem I'm facing is that I'm unable to create a test database, when I'm executing my tests using VScode
test runner. If matters here are the pytest
versions:
name : pytest
version : 8.2.2
description : pytest: simple powerful testing with Python
required by
- pytest-django requires >=5.4.0
- pytest-dotenv requires >=5.0.0
Basically, I have a test case, which uses my local database, I want to start using a virtual database, which is dynamically created when executing a test, instead of a local one. To do that, I've tried to set a Test
property inside my settings.py
database configuration:
DATABASES = {
'default': {
"NAME": "localDatabase",
"ENGINE": "django.contrib.gis.db.backends.postgis",
"USER": "test",
"PASSWORD": "test",
"HOST": "127.0.0.1",
"PORT": "5432",
"TEST": {
"NAME": "test_local"
},
},
}
So inside my test case:
class BillAPITests(APITestCase):
def test_create_bill(self):
from django.db import connection
print(connection.settings_dict["NAME"]
response = self.client.post(self.base_url, self.base_payload, format="json")
self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED)
the print gives me:
localDatabase
instead of "test_local".
As second attempt, I have tried settings up a pytest.fixture
inside my conftest.py
:
@pytest.fixture(scope="session")
def django_db_setup():
load_dotenv()
settings.DATABASES["default"] = {
"NAME": "test_local",
"ENGINE": "django.contrib.gis.db.backends.postgis",
"USER": "test",
"PASSWORD": "test",
"HOST": "127.0.0.1",
"PORT": "5432",
}
Still the same output...
I have also tried closing all connections in the `django_db_setup` before swapping my default databases using:
```py
from django import db
db.connections.close_all()
No result...
The only thing that gave me different behaviour is settings the database name directly in the django_db_setup
, like so:
settings.DATABASES["default"]["NAME"] = "test_local"
However, that way django does not automatically create me "test_local" database and it fails connecting to it.
Any help appreciated, thanks
The problem in my case was, that I've overridden the default creation of test database by Django, when running the tests. This happened by obsolete pytest fixture
that i had in my conftest.py
. As @willeM_ Van Onsem confirmed, Django by default creates a test database by appending test_
to the name of your default to use database.
In order to check which database are you using, just add a print statement into a test case:
from django.db import connection
connection.settings_dict["NAME"]
This will NOT print your default database name, but will print the database name of the currently used database.
In my case, my database configuration ended up like:
DATABASES = {
'default': {
"NAME": "localDatabase",
"ENGINE": "django.contrib.gis.db.backends.postgis",
"USER": "test",
"PASSWORD": "test",
"HOST": "127.0.0.1",
"PORT": "5432",
},
}
and when running the tests, the currently used database name is - "test_localDatabase".
As you can see, I have removed the "TEST"
key property from DATABASES
, because it overrides the default Django logic of generating a new name for the test database.