仅在第一次测试时执行数据迁移
Data migration only executed for the first test
我有一个简单的数据迁移,它创建了一个 Group
,看起来像这样:
def make_manager_group(apps, schema_editor):
Group = apps.get_model("auth", "Group")
managers_group = Group(name="managers")
managers_group.save()
class Migration(migrations.Migration):
dependencies = [
('my_app', '0001_initial'),
('auth', '0006_require_contenttypes_0002'),
]
operations = [
migrations.RunPython(make_manager_group, reverse_code=lambda *args, **kwargs: True)
]
和一个包含以下测试的简单功能测试应用程序:
from django.contrib.auth.models import Group
from django.contrib.staticfiles.testing import StaticLiveServerTestCase
class FunctionalTest(StaticLiveServerTestCase):
def setUp(self):
print("Groups : {}".format(Group.objects.all()))
def test_2(self):
pass
def test_1(self):
pass
当我 运行 测试时,我得到:
Creating test database for alias 'default'...
Groups : [<Group: managers>]
.Groups : []
.
显然,组是在创建测试数据库时创建的,但是当在测试之间重置此数据库时,它会重置为空数据库,而不是应用所有迁移后的状态。
模型本身不包含任何特殊内容(我只是为迁移创建了一个不是第一个,因为在我正在处理的项目中,但我不确定是否需要它) .
这是一个错误,还是我遗漏了一些关于数据迁移的信息,以便能够在每次测试开始时创建我的组?
编辑 1 : 我正在使用 Django 1.8.3
编辑 2 : Quick'n'dirty hack 添加到测试设置 class :
from django.contrib.auth.models import Group, Permission
if not Group.objects.all():
managers_group = Group(name="managers")
managers_group.save()
managers_group.permissions.add(
Permission.objects.get(codename='add_news'),
Permission.objects.get(codename='change_news'),
Permission.objects.get(codename='delete_news')
)
这几乎是 DRY,但直到现在,我找不到其他方法...
我回答我自己的问题:
好像是filed bug which has became documented
它说使用 TransactionTestCase
及其子类(如我的情况 LiveServerTestCase
)不会在每次测试之前插入数据迁移。它只为第一个完成一次。
它还说我们可以将 serialized_rollback
设置为 True
,这将强制回滚到已填满的数据库。但就我而言,我遇到了与错误报告中的最后一条消息相同的错误。
所以我现在要坚持我的肮脏技巧,也许会创建一个数据夹具,因为它说每次都会使用夹具。
我有一个简单的数据迁移,它创建了一个 Group
,看起来像这样:
def make_manager_group(apps, schema_editor):
Group = apps.get_model("auth", "Group")
managers_group = Group(name="managers")
managers_group.save()
class Migration(migrations.Migration):
dependencies = [
('my_app', '0001_initial'),
('auth', '0006_require_contenttypes_0002'),
]
operations = [
migrations.RunPython(make_manager_group, reverse_code=lambda *args, **kwargs: True)
]
和一个包含以下测试的简单功能测试应用程序:
from django.contrib.auth.models import Group
from django.contrib.staticfiles.testing import StaticLiveServerTestCase
class FunctionalTest(StaticLiveServerTestCase):
def setUp(self):
print("Groups : {}".format(Group.objects.all()))
def test_2(self):
pass
def test_1(self):
pass
当我 运行 测试时,我得到:
Creating test database for alias 'default'...
Groups : [<Group: managers>]
.Groups : []
.
显然,组是在创建测试数据库时创建的,但是当在测试之间重置此数据库时,它会重置为空数据库,而不是应用所有迁移后的状态。
模型本身不包含任何特殊内容(我只是为迁移创建了一个不是第一个,因为在我正在处理的项目中,但我不确定是否需要它) .
这是一个错误,还是我遗漏了一些关于数据迁移的信息,以便能够在每次测试开始时创建我的组?
编辑 1 : 我正在使用 Django 1.8.3
编辑 2 : Quick'n'dirty hack 添加到测试设置 class :
from django.contrib.auth.models import Group, Permission
if not Group.objects.all():
managers_group = Group(name="managers")
managers_group.save()
managers_group.permissions.add(
Permission.objects.get(codename='add_news'),
Permission.objects.get(codename='change_news'),
Permission.objects.get(codename='delete_news')
)
这几乎是 DRY,但直到现在,我找不到其他方法...
我回答我自己的问题:
好像是filed bug which has became documented
它说使用 TransactionTestCase
及其子类(如我的情况 LiveServerTestCase
)不会在每次测试之前插入数据迁移。它只为第一个完成一次。
它还说我们可以将 serialized_rollback
设置为 True
,这将强制回滚到已填满的数据库。但就我而言,我遇到了与错误报告中的最后一条消息相同的错误。
所以我现在要坚持我的肮脏技巧,也许会创建一个数据夹具,因为它说每次都会使用夹具。