Проведите модульные тесты в «живой» базе данных в settings.py, используя Django «manage.py test» - PullRequest
0 голосов
/ 04 марта 2010

Если у вас есть настройка базы данных в Django, как вы можете заставить TestRunner использовать «живую» базу данных (в соответствии с настройками DATABASE_ * в settings.py) вместо того, чтобы запускать их в базе данных эфемерного теста.

Например, я хотел бы запустить следующий тест для базы данных live, указанной в settings.py:

import unittest

from example import models

class DBDriverTest(unittest.TestCase): 
    db testDriver(self):
       "Connect to the live database and drop in sample value."
       m = models.MyModel('hello')
       m.save() # ... save to the live database from settings.py

В настоящее время приведенный выше код сохраняется только в созданной тестовой базе данных. Это очень ограничивает, потому что мое приложение имеет несколько параллельных процессов, работающих с базой данных - и мои модульные тесты будут неполными (и непоследовательными) без возможности перекачивать данные в «живую» базу данных и видеть, где они находятся после короткого сна.

Два возможных варианта, о которых я могу подумать:

  1. Подключите Django API, чтобы выяснить, как «вручную» подключиться к базе данных в settings.py

  2. Установите низкоуровневое соединение с «живой» базой данных и заполните ее вручную

Приоритет проблематичен, потому что он полагается на вещи под открытым API Django. Последнее проблематично, потому что оно отказывается от независимого от базы данных API базы данных Django и требует более интенсивного использования вручную.

Я благодарен за ваши мысли и вклад.

Brian

1 Ответ

2 голосов
/ 04 марта 2010

Вы должны будете определить свои собственные test_runner tearDown методы, потому что каждый тест выполняется изолированно и база данных очищается после каждого запуска.Вы можете сделать то, о чем вы просите, просто создав свой собственный test_runner, мы сделали это один раз (хотя это был не я в команде) с базой данных, к которой обращались веб-сервисы, и в течение некоторого времени мы этого не делали.есть какой-либо способ удалить что-нибудь оттуда, но удалить всю базу данных вручную ;-) Это было довольно забавно.

Отвечая на ваш вопрос: создайте свой собственный test_runner и подготовьтесь к созданию собственных tearDown методов,в котором вы будете удалять только объекты, которые вы создали.Вы должны каким-то образом хранить там primary keys, чтобы вы ничего не удаляли из действующей базы данных.

Однако , я не думаю, что это хороший способ сделать это.Запуск тестов на базе данных в реальном времени требует от вас катастрофы.Рано или поздно у вас возникнут проблемы с этим.Вместо этого вы должны сделать дамп своей действующей базы данных, подготовить fixtures из этих данных и использовать их в своих тестах.Это хорошо задокументировано и легко сделано.Таким образом, вы получите живую среду, не рискуя своими ценными данными, и вам не нужно будет писать свою собственную test_runner.На мой взгляд, это лучший и самый безопасный способ.

...