Для тестирования django, как мне использовать keepdb с mariadb - PullRequest
0 голосов
/ 10 октября 2018

У меня есть база данных с множеством неуправляемых таблиц, которые я использую для приложения django.Для тестирования я хочу использовать параметр --keepdb, чтобы мне не приходилось каждый раз заполнять эти таблицы.Я использую MariaDB для своей базы данных.Если я не использую опцию keepdb, все работает нормально, тестовая база данных создается и уничтожается должным образом.

Но когда я пытаюсь запустить тест с сохранением базы данных:

$ python manage.py test --keepdb

Я получаю следующую ошибку:

Использование существующей тестовой базы данных для псевдонима 'default' ...
Произошла ошибка при создании тестовой базы данных: (1064, "У вас есть ошибка в синтаксисе SQL; обратитесь к руководству, соответствующему версии вашего сервера MariaDB, чтобы узнатьсинтаксис для использования рядом с 'CREATE DATABASE, ЕСЛИ НЕ СУЩЕСТВУЕТ test_livedb; \ n SET sql_note' в строке 2 ")

Я предполагаю, что это проблема с другим синтаксисом между MariaDB и MySQL.Есть ли способ заставить опцию keepdb работать с MariaDB?

большое спасибо!

Ответы [ 2 ]

0 голосов
/ 31 марта 2019

Для чего стоит: эта ошибка была введена в Django 2.0.0 и исправлена ​​в Django 2.1.3 (https://code.djangoproject.com/ticket/29827)

0 голосов
/ 10 октября 2018

Две вещи - проверьте Factory Boy (для создания тестовых данных), и я бы посоветовал также проверить Pytest.Я думаю, что с неуправляемыми таблицами вы столкнетесь с проблемой (по крайней мере, по моему опыту) того, что django не создаст их в тестовой среде, и вы столкнетесь с проблемами, потому что нет файла migration длясоздать эти таблицы (так как они неуправляемые).Django запускает файлы migration при создании тестовой среды.

С Pytest вы можете запускать с флагом --nomigrations, который создает тестовую базу данных непосредственно из моделей (создавая таблицы, необходимые для ваших неуправляемых моделей).).

Если вы объедините Pytest и Factory Boy, у вас появится возможность настроить тестовые данные таким образом, чтобы они работали, как ожидалось, могли воспроизводиться и тестироваться без проблем.

Iна самом деле подходить к этому вот так (немного странно, но это работает с нашей сложной настройкой):

На моей модели:

class Meta(object):
    db_table = 'my_custom_table'
    managed = getattr(settings, 'UNDER_TEST', False)

Я создаю переменную UNDER_TEST в settings.py следующим образом:

# Create global variable that will tell if our application is under test
UNDER_TEST = (len(sys.argv) > 1 and sys.argv[1] == 'test')

Таким образом - когда приложение имеет значение UNDER_TEST, модель помечается как управляемая (и Pytest создаст соответствующую таблицу БД).Затем FactoryBoy обрабатывает помещение всех моих тестовых данных в эту таблицу (либо в setUp теста, либо в другом месте), чтобы я мог проверить его.

Это мое предложение - у других может быть что-то более ясное или более чистое.

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