В Django 1.4, 1.5, 1.6, 1.7 или 1.8 его должно быть достаточно для использования:
if 'test' in sys.argv:
DATABASES['default']['ENGINE'] = 'django.db.backends.sqlite3'
Нет необходимости переопределять TEST_NAME
1 или вызывать syncdb
для запуска тестов. Как указывает @osa, по умолчанию в движке SQLite создается тестовая база данных в памяти (TEST_NAME=':memory:'
). Вызов syncdb
не требуется, поскольку тестовая среда Django сделает это автоматически через вызов syncdb
или migrate
в зависимости от версии Django. 2 Вы можете наблюдать это с помощью manage.py test -v [2|3]
.
Очень слабо говоря, Django настраивает тестовую среду:
- Загрузка обычной базы данных
NAME
из вашего settings.py
- Обнаружение и построение ваших тестовых классов (называется
__init__()
)
- Установка базы данных
NAME
на значение TEST_NAME
- Запуск тестов для базы данных
NAME
Вот в чем проблема: На шаге 2 NAME
все еще указывает на вашу обычную (не тестовую) базу данных. Если ваши тесты содержат запросы уровня класса или запросы в __init__()
, они будут выполняться для обычной базы данных, которая, вероятно, не соответствует вашим ожиданиям. Это выявлено в ошибка # 21143 .
Не делай:
class BadFooTests(TestCase):
Foo.objects.all().delete() # <-- class level queries, and
def __init__(self):
f = Foo.objects.create() # <-- queries in constructor
f.save() # will run against the production DB
def test_foo(self):
# assert stuff
, поскольку они будут выполняться для базы данных, указанной в NAME
. Если на этом этапе NAME
указывает на действительную базу данных (например, вашу производственную базу данных), запрос будет выполнен, но может иметь непредвиденные последствия. Если вы переопределили ENGINE
и / или NAME
таким образом, что он не указывает на ранее существующую базу данных, будет выдано исключение, поскольку тестовая база данных еще не создана:
django.db.utils.DatabaseError: no such table: yourapp_foo # Django 1.4
DatabaseError: no such table: yourapp_foo # Django 1.5
OperationalError: no such table: yourapp_foo # Django 1.6+
Вместо этого:
class GoodFooTests(TestCase):
def setUp(self):
f = Foo.objects.create() # <-- will run against the test DB
f.save() #
def test_foo(self):
# assert stuff
Итак, если вы видите ошибки, убедитесь, что ваши тесты не включают в себя какие-либо запросы, которые могут попасть в базу данных вне определений методов вашего класса тестирования.
[1] В Django> = 1,7, DATABASES[alias]['TEST_NAME']
равно устарело в пользу DATABASES[alias]['TEST']['NAME']
[2] См. Метод create_test_db()
в db/backends/creation.py