Проблема с базой данных django-pytest setup_method
У меня есть следующие настройки на Ubuntu 14.04:
- Python 2.7.6
- django 1.7 [хотя я воспроизвел такое же поведение и с django 1.9]
- pytest-django 2.8.0 [также протестирован с 2.9.1]
- pytest 2.7.2 [также протестирован с 2.8.3]
И следующий тестовый код:
import pytest
from django.db import connection
import settings
from pollsapp.models import Question
original_db_name = settings.DATABASES["default"]["NAME"]
@pytest.mark.django_db
class TestExperiment(object):
def setup_method(self, method):
# it's not using the "test_" + DATABASE_NAME !
assert connection.settings_dict["NAME"] == \
settings.DATABASES["default"]["NAME"]
Question.objects.create(question_text="How are you?")
# this data remains in the main database
Хотя класс помечен для использования базы данных django, данные, созданные в конструкторе, поступают в основную (производственную) базу данных (имя взято из settings.py)
Ввод
django_db
декоратор надsetup_method
не имеет никакого значенияЭти данные, созданные в setup_method, остаются в основной базе данных, не откатываются должным образом и так, как если бы был выполнен вызов создания данных в
test_case
методТакое поведение происходит, когда тест выполняется сам по себе. При запуске в тестовом наборе вызовы db setup_method завершаются с ошибкой: Failed: доступ к базе данных не разрешен, используйте
django_db
Отметьте, чтобы включить, хотя декоратор явно присутствует (это означает, что это сообщение об ошибке не должно быть на 100% доверенным).
pytest - потрясающая среда, и django-pytest прекрасно работает, если вызовы базы данных происходят из django_db
отмеченные методы тестового примера.
Похоже, что взаимодействие с БД не должно присутствовать в специальных методах pytest, таких как setup_method
, teardown_method
и т. д. Хотя в документации об этом ничего не сказано:
https://pytest-django.readthedocs.org/en/latest/database.html
Я получаю такое поведение как с Django 1.7, так и с 1.9 (последняя стабильная версия).
Вот ссылка на весь тестовый модуль: https://github.com/zdenekmaxa/examples/blob/master/python/django-testing/tests/pytest_djangodb_only.py
1 ответ
К сожалению, методы setup_X не очень хорошо работают с приборами pytest. Настройка базы данных pytest-django основана на фикстурах pytest и поэтому не работает.
Я рекомендую вам сделать ваш setup_method автоматическим прибором, который запрашивает прибор db:
@pytest.mark.django_db
class TestExperiment(object):
@pytest.fixture(autouse=True)
def setup_stuff(self, db):
Question.objects.create(question_text="How are you?")
def test_something(self):
assert Question.objects.filter(question_text="How are you?").exists()
Сообщение об ошибке, выданное pytest-django, сбивает с толку и вводит в заблуждение. Я открыл проблему, чтобы отследить / исправить это: https://github.com/pytest-dev/pytest-django/issues/297