Une firebase database différente pour tester Django?

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 je voudrais utiliser pour les tests unitaires et une pour tout le rest. Est-il possible de configurer cela dans Django 1.2.4?

(La raison pour laquelle je pose la question est que, avec postgresql, je reçois l’erreur suivante:

 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 pourrais-je avoir cette erreur? Je suppose que je ne me soucie pas vraiment de savoir si je peux toujours utiliser SQLite pour les tests unitaires, car cela fonctionne bien.)

Dans vos 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 est d’avoir plusieurs fichiers de parameters, car je l’utilise pour maintenir un ensemble de parameters communs avec des modifications pour chaque instance. C’est un peu plus compliqué à configurer que certaines des autres solutions, mais je devais le faire de toute façon car je gérais des parameters légèrement différents pour le développement local, le développement à distance, le transfert et la production.

https://code.djangoproject.com/wiki/SplitSettings offre un certain nombre d’options pour gérer les parameters, et j’ai choisi une pratique similaire à celle décrite à l’ adresse https://code.djangoproject.com/wiki/SplitSettings#SimplePackageOrganizationforEnvironments

Donc, dans mon répertoire de projet Django, j’ai un dossier de parameters qui ressemble à ceci:

 $ tree settings settings ├── defaults.py ├── dev.py ├── dev.pyc ├── __init__.py ├── lettuce.py ├── travis.py ├── unittest.py 

Les parameters courants se trouvent dans settings / defaults.py et je les importe dans mes fichiers de parameters d’instance. Donc settings / unittest.py ressemble à ceci:

 from defaults import * DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': 'my_database', } } 

Ensuite, quand je veux lancer des tests, je viens d’exécuter:

 $ ./manage.py test --settings=settings.unittest 

utiliser sqlite pour les tests. Je vais utiliser un module de parameters différent si je veux utiliser un autre programme de test ou une configuration de firebase database différente.

Cela accélère considérablement le test d’exécution.

 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 

J’aimerais mentionner que vous pouvez spécifier la firebase database de test dans settings.py . Voir https://docs.djangoproject.com/en/2.0/ref/settings/#test :

 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'USER': 'mydatabaseuser', 'NAME': 'mydatabase', 'TEST': { 'NAME': 'mytestdatabase', }, }, } 

Si vous avez access à la création manuelle de la firebase database, vous pouvez utiliser django-nose comme votre TEST_RUNNER. Une fois installé, si vous transmettez la variable d’environnement suivante, il ne supprimera pas et ne recréera pas la firebase database.

 REUSE_DB=1 ./manage.py test 

Vous pouvez également append ce qui suit à settings.py pour que vous n’ayez pas à écrire REUSE_DB = 1 à chaque fois que vous voulez exécuter des tests:

 os.environ['REUSE_DB'] = "1" 

Note: cela laissera également toutes vos tables dans les bases de données, ce qui signifie que la configuration du test sera un peu plus rapide, mais vous devrez mettre à jour manuellement les tables (ou supprimer et recréer la firebase database vous-même) lorsque vous modifiez vos modèles.

Bien que cela soit déjà résolu …

Si votre firebase database pour les tests est juste une firebase database normale:

Je pense que vous ne faites pas de test unitaire puisque vous vous appuyez sur la firebase database. De toute façon, django contient un type de test pour cela (pas unitaire): django.test.TestCase

Vous devez dériver de django.test.TestCase au lieu de unittest.TestCase qui créera pour vous une nouvelle firebase database rehershal qui sera détruite à la fin du test.

Il y a des explications / conseils intéressants sur les tests avec db dans le lien suivant
Test des applications Django

Pourquoi pourrais-je avoir cette erreur?

En raison d’permissions insuffisantes. Vous pouvez modifier les permissions utilisateur par le ALTER USER username CREATEDB; après l’exécution de psql avec les psql de superutilisateur.

Exemple,

 $ sudo su - postgres $ psql psql (9.3.18) Type "help" for help. postgres=# ALTER USER username CREATEDB; ALTER ROLE 

J’ai résolu ce problème en créant simplement d’autres parameters 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] }