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

Я запускаю приложение в django с gunicorn. Я пытаюсь использовать селен для тестирования своего приложения, но столкнулся с проблемой.

Мне нужно создать тестовый сервер, как это делается с djangos LiveServerTestCase, который будет работать с gunicorn.

Есть ли у кого-нибудь идеи о том, как я могу это сделать?

note: может также кто-то подтвердить, что LiveServerTestCase выполняется как поток, а не процесс

Ответ 1

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

Надежный способ запуска, который выглядит как LiveServerTestCase, состоит в создании из unittest.TestCase класса тестового примера с пользовательскими методами setUpClass и tearDownClass. Метод setUpClass:

  • Устанавливает экземпляр приложения Django с настройками, подходящими для тестирования: база данных в местоположении, которая не будет мешать чему-либо еще, записывать журналы в соответствующее место и, если электронные письма отправляются во время обычных операций, с настройками электронной почты, которые не заставят ваших системных администраторов задушить вас и т.д.

    [По сути, это процедура развертывания. Поскольку мы хотим в конечном итоге развернуть наше приложение, процесс выше - это тот, который мы должны разработать в любом случае.]

  • Загрузите любые необходимые инструменты в базу данных.

  • Запускает экземпляр Gunicorn для запуска этого экземпляра приложения Django, используя для этого обычные команды OS.

tearDownClass:

  • Закрывает экземпляр Gunicorn, снова используя обычные команды ОС.

  • Удаляет базу данных, созданную для тестирования, удаляет любые файлы журналов и т.д.

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

Почему бы не попробовать использовать измененный LiveServerTestCase?

  • LiveServerTestCase включает в себя всю тестовую настройку в одном процессе: тесты, сервер WSGI и приложение Django. Gunicorn не предназначен для такой работы. Во-первых, он использует мастер-процесс и рабочие процессы.

  • Если LiveServerTestCase изменено так, чтобы каким-то образом запустить приложение Django во внешнем процессе, тогда многие преимущества этого класса выходят из окна. LiveServerTestCase полагается на то, что он может просто изменять настройки или подключения к базам данных в своем пространстве процессов и что эти модификации будут перенесены в приложение Django, потому что он живет в одном процессе. Если приложение находится в другом процессе, эти трюки не могут работать. После того как LiveServerTestCase изменен, чтобы позаботиться об этом, конечный результат близок к тому, что я изложил выше.

Дополнительно: Может ли кто-нибудь запустит Gunicorn и Django в том же процессе?

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

Ответ 2

Вплоть до головы, вы можете попытаться переопределить LiveServerTestCase.setUpClass и завершить пушки, а не LiveServerThread