2015-12-04 2 views
3

Я следующий набор на Ubuntu 14.04:Джанго-pytest выпуск базы данных setup_method

  • питона 2.7.6
  • Джанго 1,7 [хотя я воспроизвел такое же поведение с Джанго 1.9 тоже]
  • pytest-Джанго 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. Хотя класс помечается использовать базу данных Джанго, данные, созданные в конструкторе поступают в основном (производство) базы данных (название взято из settings.py)

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

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

  4. Такое поведение возникает, когда тест запускается сам по себе. При запуске в тестовом наборе вызовы db setup_method завершаются с ошибкой: Failed: доступ к базе данных не разрешен, используйте знак django_db, чтобы включить , хотя декоратор явно там (что означает, что это сообщение об ошибке не должно быть 100% доверенным btw).

pytest является удивительной рамка и Джанго-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

+0

декоратор должен быть на методе, а не на классе. – GwynBleidD

+0

Если это так, это не имеет никакого значения. И, согласно документации django-pytest, возможны модуляция, класс, метод или уровень функции. –

ответ

11

К сожалению, методы setup_X не играет хорошо с pytest светильников. Настройка базы данных pytest-django основана на инструментах pytest, и поэтому она не работает.

Я рекомендую вам сделать свой setup_method autouse арматуре, которая запрашивает дб приспособление:

@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-Джанго сбивает с толку и вводит в заблуждение, я открыл проблему для отслеживания/исправить это: https://github.com/pytest-dev/pytest-django/issues/297

+0

Спасибо. В самом деле, это работает на setup_method по назначению, но все еще происходит сбой: доступ к базе данных недопустим, используйте знак «django_db» для включения таким же образом, как указано «def teardown_method (self, db):« Спасибо за ваше объяснение, я предположил, что воздержусь из db-взаимодействий в специальных методах pytest. –

+1

setup_X и teardown_X могут прерываться в любое время. Вы должны использовать светильники для всех тестовых настроек и срывания. https://pytest.org/latest/fixture.html#fixture-finalization-executing-teardown-code описывает, как вы можете зарегистрировать функцию для запуска во время разрыва. Он будет иметь надлежащий доступ к базе данных. Пожалуйста, отметьте ответ как принятый, если вы довольны этим. – andreaspelme

Смежные вопросы