(Run Django Tests With Testcontainers)
This focuses on users who wish to forget setting up a database for tests. There's no need for manually starting up Docker compose or local database with this.
Note:
See: Altering settings at runtime: Django documentation
By default, this test runner changes default database host and port dynamically, because it's quite hard to know database host beforehand in dynamic environments, for example, some CI/CD runners.
Still, this just works and is quite simple, that's why I haven't spent that much time investigating alternative solutions.
-
Add rdtwt to your INSTALLED_APPS setting like this
INSTALLED_APPS = [ ... 'rdtwt', ]
-
Run tests with rdtwt runner,
python manage.py test --testrunner=rdtwt.runner.PostgresDiscoverRunner
Though what I really suggest is to put the following in your test settings.
# RDTWT SETTINGS
RDTWT_POSTGRESQL_IMAGE = 'postgres:14.1'
TEST_RUNNER = 'rdtwt.runner.PostgresDiscoverRunner'
This makes sure that tests run against the PostgreSQL version defined by you. It also adds up to the test confidence; at least they aren't flaky because of a database version changing without your knowledge.
Example:
Defining all available options.
# Database
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'postgres',
'USER': 'postgres',
'PASSWORD': 'postgres',
'HOST': '127.0.0.1',
'PORT': '5432'
}
}
# RDTWT SETTINGS
RDTWT_POSTGRESQL_IMAGE = 'postgres:14.1'
TEST_RUNNER = 'rdtwt.runner.PostgresDiscoverRunner'
RDTWT_DATABASES = ["default"] # Add more if you have multiple databases
RDTWT_POSTGRESQL_USER = 'postgres'
RDTWT_POSTGRESQL_PASSWORD = 'postgres'
RDTWT_POSTGRESQL_NAME = 'postgres'