web-dev-qa-db-fra.com

Une autre base de données 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 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.

50
Nick Heiner

Dans votre settings.py (ou local_settings.py):

import sys
if 'test' in sys.argv:
    DATABASES['default'] = {
        'ENGINE': 'Django.db.backends.sqlite3',
        'NAME': 'mydatabase'
    }
62
Sam Dolan

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.

28
Geoffrey Hing

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',
        },
    },
}
9
Leon Mak

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
6
laffuste

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

3
Mario Corchero

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.

3
mhost

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]
}
1
Caco

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
1
Samkit Jain