Подтвердить что ты не робот

Как запустить блок-тесты django в производственной базе данных?

Я начинаю отношения развития TDD и набираю unit-тесты для своего приложения django. Я знаю приборы и знаю, что тесты должны выполняться, но для данного теста мне нужно выполнить его во всей базе данных, а json fixture для 10-миллионной базы данных строк - это не то, что я хотел бы обрабатывать, кроме того, этот тест является "только для чтения".

Итак, вопрос в том, как вы настраиваете свои тестовые классы для работы в производственной базе данных? Я предполагаю, что это может быть так же просто, как добавление параметра DATABASE_NAME в методе setUp для определенного теста. Но настройки .DATABASE_NAME = "prod_db" приводят к тому, что во время выполнения теста параметры "NameError: global name" не определены ". Кроме того, существует риск, описанный в http://code.djangoproject.com/ticket/11987, который вы можете случайно удалить производственную базу данных.

Итак, как это возможно, или, что еще лучше, что лучше всего для запуска одного теста тестового набора в производственной базе данных вместо временного?

Приветствуйте заранее за любые мнения!

4b9b3361

Ответ 1

Во-первых, если вы запускаете его в производственной базе данных, это не так много для теста "unit".

Это первоклассное пакетное задание и должно рассматриваться как производственное пакетное задание первого класса.

Вы можете использовать команду Django test для просмотра производственных данных. Он всегда создает пустую базу данных, которая заполняется из светильников в TestCase.

Вы можете сделать свою производственную базу данных обработкой надлежащей команды управления. Это правильно настроенная среда, поэтому ваша команда может просто использовать Django ORM для обработки ваших данных.

Альтернативой является то, что вы настраиваете settings. Или используйте переменную среды DJANGO_SETTINGS_MODULE или используйте функцию settings.configure() для создания среды.

Затем вы можете импортировать модели и выполнить обработку, которую хотите сделать, против производственной базы данных.

Вы можете назвать это "тест", если хотите, но вы смотрите на производственные данные, поэтому его нужно рассматривать как производственное приложение в отношении получения файла настроек и использования надлежащей конфигурации ORM.

Ответ 2

В случае, если кто-то погуглит здесь в поисках решения данной проблемы, здесь приведен скелет о том, как выполнять модульные тесты в производственной базе данных django. Обратитесь к разделу daango docs здесь, чтобы узнать структуру файла/директории и инструкции о том, куда поместить данный код. Он должен находиться в yourapp/management/commands/newcommandname.py, а папка управления и команды должны содержать пустые файлы __init__.py, что заставляет python рассматривать их как допустимые модули.

Набор тестов можно запустить как:

$python manage.py newcommandname

И вот код, который вы должны вставить в yourapp/management/commands/newcommandname.py:

from django.core.management.base import BaseCommand
import unittest

class Command(BaseCommand):
    help = """
    If you need Arguments, please check other modules in 
    django/core/management/commands.
    """

    def handle(self, **options):
        suite = unittest.TestLoader().loadTestsFromTestCase(TestChronology)
        unittest.TextTestRunner().run(suite)


class TestChronology(unittest.TestCase):
    def setUp(self):
        print "Write your pre-test prerequisites here"

    def test_equality(self):
        """
        Tests that 1 + 1 always equals 2.
        """
        from core.models import Yourmodel
        self.failUnlessEqual(1 + 1, 2)

Ответ 3

Этот TEST_RUNNER работает с Django 1.3

from django.test.simple import DjangoTestSuiteRunner as TestRunner

class DjangoTestSuiteRunner(TestRunner):
    def setup_databases(self, **kwargs):
        pass

    def teardown_databases(self, old_config, **kwargs):
        pass

Ответ 4

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

Вы можете установить параметр TEST_RUNNER в своем файле settings.py. По умолчанию находится в django.test.simple.run_tests. Вы можете посмотреть на источник здесь: http://code.djangoproject.com/browser/django/trunk/django/test/simple.py

Скопируйте и вставьте код в новый файл и удалите из него следующие строки:

connection.creation.create_test_db(verbosity, autoclobber=not interactive)
...
connection.creation.destroy_test_db(old_name, verbosity)

Это предотвратит django от создания тестовой базы данных и сброса конфигурации базы данных вашего файла настроек.

Ответ 5

Не очень хорошая идея, но если вы знаете, что делаете (в основном нарушаете свою работу), вы можете проверить этот параметр:

https://docs.djangoproject.com/en/2.2/ref/settings/#test

DATABASES = {
  'default': {
     ...
     'TEST': {
        'NAME': 'your prod db'
     }
}