我在Ubuntu 14.04上进行了以下设置:
以下测试代码:
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
方法中进行数据创建调用,它们就会回滚
当测试单独运行时会发生此行为。在测试套件中运行时,setup_method db调用失败,并显示:Failed:不允许数据库访问,使用django_db
标记启用
虽然装饰器显然在那里(这意味着这个错误信息不是100%可信的btw)。
pytest是一个很棒的框架,如果数据库调用是从django_db
标记的测试用例方法发生的,那么django-pytest很有用。
看起来在setup_method
,teardown_method
等特殊pytest方法中不应该存在数据库交互。虽然文档没有说明任何内容:
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 :(得分:15)
不幸的是,setup_X方法对pytest fixtures不起作用。 pytest-django的数据库设置基于pytest fixture,因此不起作用。
我建议你让你的setup_method成为一个autouse fixture,它要求db fixture:
@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