Модульные тесты Django, не выполняющиеся на сборках Travis CI - PullRequest
0 голосов
/ 11 июня 2018

У меня есть очень простое приложение Django (Python 3.6.4), и я написал модульный тест, который проходит локально.База данных SQLite в памяти (по умолчанию) создается для тестов.Когда моя сборка Travis CI выполняет те же тесты, тесты проходят, но команда тестирования не выполняется со следующей ошибкой:

File "/home/travis/virtualenv/python3.6.5/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py", line 301, in execute
    return Database.Cursor.execute(self, query)
django.db.utils.OperationalError: near "SCHEMA": syntax error

The command "python manage.py test --settings=myapp.dev_settings" exited with 1.

Одна странная вещь, которую я замечаю, заключается в том, что, когда тесты запускаются на Travis, он говорит, что использует повторносуществующей БД и никогда не разрушает ее после запуска тестов:

$ python manage.py test --settings=myapp.dev_settings

Использование существующей тестовой базы данных для псевдонима 'default' ...

Я не совсем понимаю, потому что этодолжна быть БД в памяти, и когда я запускаю ее локально, каждый раз создается новая база данных:

Creating test database for alias 'default'... 
. . .
Destroying test database for alias 'default'... 

Мой dev_settings.py файл имеет базу данных sqlite в файловой системе, но она используется только для запускалокальный сервер разработки:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

Трэвис устанавливает все зависимости и они соответствуют моей локальной среде (я вполне уверен).

Любая помощь будет отличной, я определенно скучаючто-то здесь очевидное !!!

Ответы [ 3 ]

0 голосов
/ 22 июня 2018

@ LaSmell правильно (у меня была такая же проблема).Это потому, что вы пытаетесь получить доступ к зависимостям Heroku в вашей сборке.

НО я все еще могу показать вам, как реализовать решение.

Вам нужно сделать 3 вещи Чтобы решить эту проблему.

1 - укажите новый документ с требованиями без django-heroku

Я лично создал другой файл под названием require-build.txt, и он содержит всете же зависимости, кроме django-heroku == 0.3.1

Я просто удаляю его.

2 - укажите новый файл требований в .travis.yml

В вашем файле .travis.yml просто замените

install:
  - pip install -r requirements.txt

на

install:
  - pip install -r requirements-build.txt

3 - Учет этих изменений в ваших настройках.py файл

Чтобы убедиться, что вы не импортируете heroku-django, если он не установлен, сначала проверьте, можно ли его импортировать.Я сделал:

# Try to import django-heroku depending on Travis or Heroku
try:
    # Configure Django App for Heroku.
    import django_heroku
    django_heroku.settings(locals())
except ImportError:
    found = False

Таким образом, он будет использовать только django-heroku, если он был установлен.Так как Heroku по умолчанию использует require.txt, этот патч работает отлично.

Надеюсь, это поможет!Мне потребовалось некоторое время, чтобы получить это сам.

0 голосов
/ 06 июля 2018

Это связано с тем, что пакет Django-Heroku устанавливает свой собственный Test Runner, который выполняет дополнительную работу с базой данных, если обнаруживает среду CI, предположительно для удовлетворения их предложения Heroku CI:

 # Enable test runner if found in CI environment.
 if 'CI' in os.environ:
     config['TEST_RUNNER'] = 'django_heroku.HerokuDiscoverRunner'

Тестrunner делает следующее, что не работает для SQLite:

with connection.cursor() as cursor:
    cursor.execute(
        """
            DROP SCHEMA public CASCADE;
            CREATE SCHEMA public;
            GRANT ALL ON SCHEMA public TO postgres;
            GRANT ALL ON SCHEMA public TO public;
            COMMENT ON SCHEMA public IS 'standard public schema';
        """
    )

К сожалению, эта проверка также обнаруживает среды CI, отличные от Heroku, такие как Travis или GitLab CI, и пытается использовать вышеуказанную конфигурацию.

Вы можете решить эту проблему, отключив тестер Heroku следующим образом: settings.py:

# Configure Django App for Heroku.
django_heroku.settings(locals(), test_runner=False)
0 голосов
/ 12 июня 2018

В трассировке стека сборки travis я заметил, что выполняется неожиданный пакет:

  File "/home/travis/virtualenv/python3.6.5/lib/python3.6/site-packages/django_heroku/core.py", line 41, in teardown_databases
self._wipe_tables(connection)

Проблема заключалась в том, что я выполнял свои тесты с файлом settings.py, который содержал специфический код Heroku (развертывание):

import django_heroku
import dj_database_url

# Parse database configuration from Heroku's $DATABASE_URL (Postgres)
DATABASES = {
    'default': dj_database_url.config(conn_max_age=500, ssl_require=True)
}

# Activate Django-Heroku (DATABASE_URL and all that).
django_heroku.settings(locals())

И зависимости в моем файле require.txt:

django-heroku==0.3.1

Как только я удаляю всю конфигурацию Heroku из конфигурации сборки Travis, сборка проходит!

Все еще не уверены, как я не видел, что это местная ошибка.

...