DATABASES = {
# 'default': {
# 'ENGINE': 'postgresql_psycopg2',
# ...
# }
# for unit tests
'default': {
'ENGINE': 'Django.db.backends.sqlite3',
'NAME': 'mydatabase'
}
}
J'ai deux bases de données: une que j'aimerais utiliser pour les tests unitaires et une pour tout le reste. Est-il possible de configurer cela dans Django 1.2.4?
(La raison pour laquelle je pose cette question est parce qu'avec postgresql, l'erreur suivante apparaît:
foo@bar:~/path/$ python manage.py test
Creating test database 'default'...
Got an error creating the test database: permission denied to create database
Type 'yes' if you would like to try deleting the test database 'test_baz', or 'no' to cancel: yes
Destroying old test database...
Got an error recreating the test database: database "test_baz" does not exist
Pourquoi est-ce que je pourrais avoir cette erreur? Je suppose que je ne me soucie pas vraiment de pouvoir utiliser SQLite pour les tests unitaires, car cela fonctionne bien.
Dans votre settings.py
(ou local_settings.py
):
import sys
if 'test' in sys.argv:
DATABASES['default'] = {
'ENGINE': 'Django.db.backends.sqlite3',
'NAME': 'mydatabase'
}
La façon dont je gère cela consiste à avoir plusieurs fichiers de paramètres, car je l’utilise pour conserver un ensemble de paramètres communs avec des modifications pour chaque instance. C'est un peu plus compliqué à installer que certaines des autres solutions, mais je devais le faire quand même car je gérais des paramètres légèrement différents pour le développement local, le développement à distance, la mise en scène et la production.
https://code.djangoproject.com/wiki/SplitSettings dispose d'un certain nombre d'options pour la gestion des paramètres, et j'ai choisi une pratique similaire à celle décrite à https://code.djangoproject.com/wiki/SplitSettings # SimplePackageOrganizationforEnvironments
Donc, dans mon répertoire de projet Django, j'ai un dossier de paramètres qui ressemble à ceci:
$ tree settings
settings
├── defaults.py
├── dev.py
├── dev.pyc
├── __init__.py
├── lettuce.py
├── travis.py
├── unittest.py
Les paramètres communs se trouvent dans settings/defaults.py et je les importe dans mes fichiers de paramètres d'instance. Donc, settings/unittest.py ressemble à ceci:
from defaults import *
DATABASES = {
'default': {
'ENGINE': 'Django.db.backends.sqlite3',
'NAME': 'my_database',
}
}
Ensuite, lorsque je veux exécuter des tests, j'exécute simplement:
$ ./manage.py test --settings=settings.unittest
utiliser sqlite pour les tests. J'utiliserai un module de paramètres différent si je veux utiliser un autre programme de test ou une configuration de base de données différente.
Souhaitez-vous mentionner que vous pouvez spécifier la base de données de test déjà dans settings.py
. Voir https://docs.djangoproject.com/fr/2.0/ref/settings/#test :
DATABASES = {
'default': {
'ENGINE': 'Django.db.backends.postgresql',
'USER': 'mydatabaseuser',
'NAME': 'mydatabase',
'TEST': {
'NAME': 'mytestdatabase',
},
},
}
Cette accéléré teste l'exécution de façon spectaculaire.
import sys
if 'test' in sys.argv:
DATABASES['default'] = {
'ENGINE': 'Django.db.backends.sqlite3',
'TEST_CHARSET': 'UTF8', # if your normal db is utf8
'NAME': ':memory:', # in memory
'TEST_NAME': ':memory:', # in memory
}
DEBUG = False # might accelerate a bit
TEMPLATE_DEBUG = False
from Django.core.management import call_command
call_command('syncdb', migrate=True) # tables don't get created automatically for me
Bien que cela soit déjà résolu ...
Si votre base de données pour les tests est juste une base de données normale:
Je pense que vous ne faites pas de test unitaire puisque vous vous basez sur la base de données. Quoi qu'il en soit, Django contient un type de test pour cela (non unitaire): Django.test.TestCase
Vous devez dériver de Django.test.TestCase
au lieu de unittest.TestCase
pour créer une nouvelle base de données de répétition qui sera détruite à la fin du test.
Vous trouverez des explications/conseils intéressants sur les tests avec db dans le lien suivant.
Test des applications Django
Si vous avez accès à la création manuelle de la base de données, vous pouvez utiliser Django-nose en tant que votre TEST_RUNNER. Une fois installé, si vous transmettez la variable d’environnement suivante, il ne sera pas supprimé et recréé la base de données.
REUSE_DB=1 ./manage.py test
Vous pouvez également ajouter les éléments suivants à settings.py afin que vous n'ayez pas à écrire REUSE_DB = 1 à chaque fois que vous souhaitez exécuter des tests:
os.environ['REUSE_DB'] = "1"
Note: cela laissera toutes vos tables dans les bases de données, ce qui signifie que la configuration de test sera un peu plus rapide, mais vous devrez mettre à jour manuellement les tables (ou supprimer et recréer vous-même la base de données). quand vous changez de modèle.
J'ai résolu ce problème en créant simplement d'autres paramètres constants DATABASES_AVAILABLE
.
DATABASES_AVAILABLE = {
'main': {
'ENGINE': 'Django.db.backends.postgresql_psycopg2',
'NAME': 'nep',
'USER': 'user',
'PASSWORD': 'passwd',
'Host': 'localhost',
},
'remote': {
'ENGINE': 'Django.db.backends.postgresql_psycopg2',
'NAME': 'nes_dev',
'USER': 'usr',
'PASSWORD': 'passwd',
'Host': '200.144.254.136',
},
'sqlite': {
'ENGINE': 'Django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
},
}
# This solves the problem with tests
# Define a system variable called Django_DATABASE_TEST and set it to the
# the database you want
database = os.environ.get('Django_DATABASE_TEST', 'main')
DATABASES = {
'default': DATABASES_AVAILABLE[database]
}
Pourquoi est-ce que je pourrais avoir cette erreur?
En raison d'autorisations insuffisantes. Vous pouvez modifier les autorisations utilisateur de ALTER USER username CREATEDB;
après avoir exécuté psql
avec les privilèges de superutilisateur.
Exemple,
$ Sudo su - postgres
$ psql
psql (9.3.18)
Type "help" for help.
postgres=# ALTER USER username CREATEDB;
ALTER ROLE