2013-12-17 5 views
2

Я ищу способ запуска полной установки сельдерей во время Джанго испытаний спросил в этом other SO questionRun UnitTest On Main Django базы данных

Подумав об этом, я думаю, я мог бы согласиться на запуск UnitTest (это больше теста интеграции), в котором я запускаю тестовый скрипт против основной базы данных Django (development). Есть ли способ писать unittests, запускать их с помощью Nose и делать это против основной базы данных? Я предполагаю, что это будет вопрос о том, чтобы сообщить Носу (или что-то еще) о настройках django.

Я просмотрел django-nose, но не смог найти способ сказать ему, чтобы использовать основную БД, а не тестовую.

ответ

4

Я не знаю о носу, но вот как работать против существующего дБ с помощью модульных тестов django (1.6).

from django.test.runner import DiscoverRunner 
from django.db import transaction 

class ExistingDBTestRunner(DiscoverRunner): 

    def run_tests(self, test_labels, extra_tests=None, **kwargs): 
     self.setup_test_environment() 
     suite = self.build_suite(test_labels, extra_tests) 
     #old_config = self.setup_databases() 
     result = self.run_suite(suite) 
     #self.teardown_databases(old_config) 
     self.teardown_test_environment() 
     return self.suite_result(suite, result) 

Тогда в settings.py

if 'test' in sys.argv: 
    TEST_RUNNER = '<?>.ExistingDBTestRunner' 
    # alternative db settings? 

Это будет немного отличаться в более старых версиях Джанго. Кроме того, вам может потребоваться переопределить _fixture_setup и _fixture_teardown в ваших тестовых случаях.

Вышеупомянутый код будет подключаться к существующей базе данных, но поскольку каждый тест завернут в транзакцию, изменения не будут доступны для других подключений (например, работник сельдерея). Самый простой способ отключить транзакции - это подкласс от unittest.TestCase вместо django.test.TestCase.

+0

joshua, спасибо, это хорошее начало. Два вопроса. Во-первых, где я бы сбросил код тестового бегуна. Использование Django 1.5.1. Любой способ заставить его работать над этим? https://pypi.python.org/pypi/django-discover-runner похоже, что это может помочь, но на самом деле не хочу менять способ выполнения всех моих тестов на данный момент или, по крайней мере, минимизировать необходимость переписывать старые тесты, не уверен, что это справедливое предположение. – Andres

+0

В Django 1.5 подкласс класса «django.test.simple.DjangoTestSuiteRunner» и в основном делает то же самое (удалите установку и отключение тестовых баз данных). Возможно, вы также не сможете положиться на откаты точки сохранения, потому что django действительно не делает это до 1.6. – joshua

+0

Как вы говорите, будет сложно интегрировать существующие тесты. Вы можете написать новый набор тестов в качестве команды управления. Посмотрите на этот ответ: http://stackoverflow.com/a/1648881/426600 – joshua

0

Вы имели в виду django-nose? Похоже, это был бы правильный инструмент для работы.

+1

Правильно, я посмотрел на него. Знаете ли вы способ получить django-нос, чтобы использовать основную БД вместо создания тестовой БД? – Andres

+0

загляните в django_nose/runner.py, потому что есть способ не создавать db для каждого прогона. Возможно, вы могли бы связать реальное имя db в функции _get_test_db_name() и использовать REUSE_DB env var? – David

Смежные вопросы