Как запустить тесты Django на Heroku - программирование
Подтвердить что ты не робот

Как запустить тесты Django на Heroku

У меня есть приложение, которое развертывается в Heroku, и я хотел бы иметь возможность запускать тестовый набор после развертывания в целевой среде. Я использую надстройку Heroku Postgres, а это значит, что у меня есть доступ только к одной базе данных. У меня нет прав на создание новых баз данных, что, в свою очередь, означает, что стандартная команда теста Django терпит неудачу, так как она не может создать базу данных test_ *.

$ heroku run python manage.py test
Running `python manage.py test` attached to terminal... up, run.9362
Creating test database for alias 'default'...
Got an error creating the test database: permission denied to create database

Есть ли способ обойти это?

4b9b3361

Ответ 1

Оказывается, я ошибался. Я не тестировал то, что, как я думал, тестировалось... Поскольку Heroku Routing Mesh отправляла запросы на разные серверы, LiveServerTestCase запускал веб-сервер на одной машине, а Selenium полностью подключался к другим машинам.

Обновляя файл Heroku Procfile:

web: python src/manage.py test --liveserver=0.0.0.0:$PORT

переопределяя параметр DATABASES, чтобы указать на тестовую базу данных, а также настроить бегун набора тестов, связанный ниже (та же идея все еще имеет место: переопределить setup_databases, чтобы он только уменьшал/воссоздавал таблицы, а не весь базы данных), я смог запустить удаленные тесты. Но это еще более хаки/больно/неэффективно. Все еще ищете что-то лучшее! Извините за путаницу.


(обновленный ответ ниже)

Вот шаги, которые мне помогли:

  • Создайте дополнительную бесплатную базу данных Postgres, используя инструментальную панель Heroku.

heroku addons:add heroku-postgresql:dev

  • Используйте класс HerokuTestSuiteRunner, который вы найдете здесь.

Этот пользовательский тестовый бегун требует, чтобы вы определили параметр TEST_DATABASES, который следует за типичным форматом DATABASES. Например:

TEST_DATABASES = {
    'default': dj_database_url.config(env='TEST_DATABASE_URL')
}

Затем установите параметр TEST_RUNNER как путь к Python, где можно найти HerokuTestSuiteRunner.

Теперь вы можете запускать тесты Django на Heroku с использованием данной базы данных. Это очень быстрый взлом... Позвольте мне знать, как его можно улучшить/сделать менее хаки. Наслаждайтесь!



(исходный ответ ниже)

Несколько соответствующих решений обсуждались здесь . Как вы можете прочитать в Django docs, "[w] используя механизм базы данных SQLite, тесты по умолчанию будут использовать встроенную память базы данных".

Хотя это не полностью проверяет механизм базы данных, который вы используете на Heroku (я все еще ищут решение, которое это делает), установка механизма базы данных SQLite позволит по крайней мере разрешить вам выполнять ваши тесты.

См. приведенный выше StackOverflow question для некоторых указателей. Есть как минимум два пути: тестирование if 'test' in sys.argv перед тем, как заставить SQLite работать в качестве механизма базы данных или иметь специальный файл настроек, используемый при тестировании, который затем можно передать в django manage.py test с помощью параметра --settings.

Ответ 2

Начиная с версии 1.8, у Django теперь есть опция keepdb, которая позволяет повторить использование той же базы данных во время тестов.

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

У этого есть преимущество пропускать действия create и destroy, которые могут значительно уменьшить время для запуска тестов, особенно в большом наборе тестов.

Если тестовая база данных не существует, она будет создана при первом запуске и затем сохраняется для каждого последующего запуска.

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

Так как он также позволяет тестовой базе данных существовать до запуска тестов, вы можете просто добавить новый экземпляр Postgres Heroku к вашему dyno и настроить тесты для использования этой конкретной базы данных.

Бонус: вы также можете использовать опцию failfast, которая завершается, как только ваш первый тест выйдет из строя, t должен ждать завершения всех тестов.

Однако, если вы развертываете вещи в Heroku и используете Heroku Pipelines, доступен еще лучший вариант: Heroku ДИ.