Ускорение тестирования Django

Я хочу узнать больше о ваших потоках тестирования с Django.

Справочная информация http://docs.djangoproject.com/ru/dev/topics/testing/

Я сталкиваюсь с трудностями при использовании разработки, основанной на тестах. Тест-драйв Django постоянно создает все db-модели в тестовом db при запуске. Для наших текущих проектов (от 40 до 240 моделей) это означает, что для начала тестов требуется 20 секунд.

Это делает его совершенно неработоспособным для тестирования новой функции. Мой вопрос, как вы, парни, работаете вокруг этого?

Я пробовал несколько вещей в прошлом.) – измените тестовый загрузчик для повторного использования одного и того же теста db каждый раз и примените миграцию при необходимости b.) – запустите мои модульные тесты из потока __main__ файлов python

опция b неудобна с sys.path, опция a выполнима, но, похоже, не является способом django.

Обновление: вариант A действительно не является таким плохим решением. Это просто немало усилий. Это заставляет меня полагать, что люди используют другое обходное решение. SQL Lite может быть обходным путем. Но я думаю, что их больше.

  • Сравните (утвердите равенство) две сложные структуры данных, содержащие массивы numpy в unittest
  • Объект Python Mock с методом, называемым несколько раз
  • Тестирование модуля Argparse: подавить справочное сообщение
  • Разница между setUpClass и setUp в Python unittest
  • Python mock несколько возвращаемых значений
  • Выполнение одиночного unittest над последовательностью в python
  • Пропустить unittest тест без синтаксиса декоратора
  • Как я могу указать базу данных для использования тестов Django, а не создавать ее каждый раз?
  • 7 Solutions collect form web for “Ускорение тестирования Django”

    изменить тестовый загрузчик для повторного использования одного и того же теста db каждый раз и применять миграции при необходимости

    1. Я не вижу ничего плохого в написании собственного тестового бегуна, который просто обрезает таблицы вместо того, чтобы отбрасывать и создавать базу данных. Это джангоический, поскольку он решает определенную проблему. Существует открытый билет, позволяющий группировать тестовые примеры в тестовые комплекты. Как только он будет исправлен, вы сможете сгруппировать свои тестовые примеры в комплекты для упрощения управления. Вы также можете проверить патч, прикрепленный к билету, и посмотреть, соответствует ли он вашей цели.

    2. Как предложил Нед, вы можете использовать базу данных в памяти. Это во многом зависит от модели данных и запросов, которые переносятся через базы данных.

    3. Если вы еще не пытались реорганизовать свои тестовые примеры. По моему опыту не всем тестовым классам нужен подкласс класса django.test.TestCase . Узнайте те тестовые классы, которые могут выполняться с помощью подкласса unittest.TestCase . Это немного ускорит работу.

    4. Реорганизовать светильники. Переместите общие светильники в один файл и загрузите их перед тестовым запуском, а не внутри каждого тестового класса (используя fixtures = [...] ).

    Использование базы данных SQLite в памяти во время тестирования определенно ускоряет работу.

    Мне не нравится идея использования другой базы данных (SQLite) для тестирования, поэтому мои модульные тесты используют ту же базу данных, что и производственное приложение – postgres.

    Исходя из этого, это делает создание / разрушение базы данных самым медленным шагом при выполнении тестов.

    Django 1.8 решит эту проблему с помощью флага –keepdb

    Но мы все еще не находимся, поэтому мы должны заниматься другими средствами.

    Решение 1) Использовать pytest-django

    Вы можете использовать это, чтобы ваши тесты выполнялись без повторного создания базы данных. Оно работает. Если вы только заботитесь о выполнении тестов в командной строке, я предлагаю это.

    В моем случае мне нравится использовать IDE PyCharm, и возможность запуска тестов с помощью щелчка правой кнопкой мыши / методов определенно является плюсом для меня, поэтому мне пришлось пойти с …

    Решение 2) Трюк TEST_MIRROR.

    В файле settings.py настройте свою базу данных следующим образом:

     if os.getenv('USE_TEST_DB') == '1': DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'mydbtesting', 'USER': 'mydb', 'PASSWORD': 'mydb', 'HOST': 'localhost', 'PORT': '5432', 'TEST_MIRROR': 'default', } } else: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'mydb', 'USER': 'mydb', 'PASSWORD': 'mydb', 'HOST': 'localhost', 'PORT': '5432', } } 

    Итак, «mydb» – это база данных, которая будет использоваться для нормального выполнения, а «mydbtesting» – для тестов.

    Значение TEST_MIRROR самом деле не предназначено для этого, но факт заключается в том, что если вы запускаете тесты с подобной базой данных, Django не будет воссоздавать / уничтожать то, что мы хотим.

    Но сначала мы должны создать эту базу данных с чем-то вроде:

     export USE_TEST_DB=1 ./manage.py syncdb --migrate 

    Затем, когда вы хотите быстро запускать тесты, просто установите для переменной среды USE_TEST_DB значение «1». Чтобы получить такую ​​же выгоду от Pycharm, вы можете перейти к параметрам Run / Debug Configurations, Defaults / Django, затем к переменным среды, добавить USE_TEST_DB = 1


    ОБНОВИТЬ:

    Пример приложения находится на Github: https://github.com/freedomsponsors/www.freedomsponsors.org/blob/099ec1a7a1c404eba287d4c93d58c8cf600b2769

    Вы можете запускать только те тесты, которые вам интересны, посмотрите здесь: http://docs.djangoproject.com/en/dev/topics/testing/?from=olddocs#running-tests

    Как в этом примере – запустите только specyfic TestCase:

     $ ./manage.py test animals.AnimalTest 

    Что касается тестовой базы данных – она ​​создается и уничтожается при каждом запуске теста 🙁 Также для тестирования вы можете использовать базу данных sqlite, если это возможно в вашем рабочем процессе.

    Я нашел другой способ ускорить тестирование. Если ваши тестовые модели являются авторизованными пользователями (модель User ), и вы устанавливаете для них пароль, хеширующая функция занимает приличное количество миллисекунд, чтобы закончить. То, что я делаю, это добавить к моим настройкам теста:

     PASSWORD_HASHERS = ( 'django.contrib.auth.hashers.MD5PasswordHasher', ) 

    Это обеспечивает хеширование MD5 для пароля, которое намного быстрее, чем значение по умолчанию. В моем случае это улучшение 12 тестов, каждый из которых создает 7 пользователей, от 4,5 секунд до 500 мс.

    Не добавляйте это в свои производственные настройки!

    Я нашел другой способ ускорить тестирование. Самая трудоемкая операция – запись / чтение с жесткого диска (я использую sqlite для тестирования). Решение – создать ramdisk и поместить там файл базы данных sqlite. Я сократил время тестирования в 10 раз.

    Создание ramdisk:

     #!/bin/sh mkdir -p /tmp/ramdisk; chmod 777 /tmp/ramdisk mount -t tmpfs -o size=256M tmpfs /tmp/ramdisk/ 

    Изменение пути к файлу db:

     DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': '/tmp/ramdisk/test.db', 'TEST_NAME': '/tmp/ramdisk/test.db', } } 

    Вот простые тестовые инструменты, которые не поддерживают перезагрузку базы данных вместе с сигналами, поэтому вам не нужно заботиться о тестовой базе данных https://github.com/plus500s/django-test-tools

    Interesting Posts

    Преобразовать диапазон чисел в другой диапазон, поддерживая коэффициент

    что делает –enable-optimizations делать при компиляции python?

    Показывать ход вызова карты пула многопроцессорности пула Python?

    Ошибка импорта в twilio

    Как я могу проанализировать код Python для выявления проблемных областей?

    Как импортировать src из модуля тестирования в python

    Прогнозирование в Caffe – Исключение: аргументы ввода blob не соответствуют чистым входам

    Лучший холст для рисования в wxPython?

    Сортировка списка кортежей по второму элементу (целочисленное значение)

    python обрабатывает длинные ints по-разному на Windows и Unix

    Чтение файла в словарь и подсчет количества записей

    Масштабировать изображение в matplotlib без изменения оси

    Несколько операторов, найденных при компиляции одного оператора

    Какой модуль JSON можно использовать в Python 2.5?

    Как получить горячие клавиши быстрого доступа Tkinter Mac (cmd + key)

    Python - лучший язык программирования в мире.