Проблема с базой данных 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
  1. Хотя класс помечен для использования базы данных django, данные, созданные в конструкторе, поступают в основную (производственную) базу данных (имя взято из settings.py)

  2. Ввод django_db декоратор над setup_method не имеет никакого значения

  3. Эти данные, созданные в setup_method, остаются в основной базе данных, не откатываются должным образом и так, как если бы был выполнен вызов создания данных в test_case метод

  4. Такое поведение происходит, когда тест выполняется сам по себе. При запуске в тестовом наборе вызовы 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

Другие вопросы по тегам