Как запустить юнит-тесты django в производственной базе данных? - PullRequest
21 голосов
/ 29 октября 2009

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

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

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

Заранее благодарим за любые мнения!

Ответы [ 4 ]

63 голосов
/ 30 октября 2009

В случае, если кто-то погуглит здесь в поисках решения для данной проблемы, вот скелет о том, как выполнять модульные тесты в производственной базе данных django. Проверьте секцию django 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)
12 голосов
/ 30 октября 2009

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

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

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

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

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

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

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

4 голосов
/ 06 июня 2014

Этот 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
2 голосов
/ 30 октября 2009

Юнит-тест предназначен для тестирования без каких-либо побочных эффектов. Хотя ваш тест не будет ничего, что называется 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 создать тестовую базу данных и сбросить конфигурацию базы данных вашего файла настроек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...