【发布时间】:2014-10-27 13:42:28
【问题描述】:
我有一个包含大量数据的生产数据库。我想使用其中的一些数据来运行单元测试,但是在测试过程开始时使用所有这些数据会导致相当长的时间来构建数据库。我想避免这种情况。
我使用manage.py testserver 命令创建了一个测试数据库,然后删除了所有我不想通过管理界面包含在内的数据。如何创建保留在默认测试数据库中的数据夹具?
【问题讨论】:
我有一个包含大量数据的生产数据库。我想使用其中的一些数据来运行单元测试,但是在测试过程开始时使用所有这些数据会导致相当长的时间来构建数据库。我想避免这种情况。
我使用manage.py testserver 命令创建了一个测试数据库,然后删除了所有我不想通过管理界面包含在内的数据。如何创建保留在默认测试数据库中的数据夹具?
【问题讨论】:
现在更容易将测试数据保存到夹具中。
当您运行 django 单元测试时,通过将 test_ 放在默认数据库的名称之前,会自动创建一个 test 数据库。我们可以通过在settings.py 上创建一个新数据库来让 django 知道这个数据库。例如
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'CONN_MAX_AGE': 3600,
'NAME': 'mydatabase',
'USER': 'user',
'PASSWORD': 'pass',
'HOST': '127.0.0.1',
'PORT': '3306',
'OPTIONS': {'charset': 'utf8mb4'}
},
'test': {
'ENGINE': 'django.db.backends.mysql',
'CONN_MAX_AGE': 3600,
'NAME': 'test_mydatabase',
'USER': 'user',
'PASSWORD': 'pass',
'HOST': '127.0.0.1',
'PORT': '3306',
'OPTIONS': {'charset': 'utf8mb4'}
}
}
然后运行 unittest 在第一行设置断点,根据需要编辑测试数据库,然后运行以下命令:
./manage.py dumpdata app_name -o filename.json --database test
这会将test 数据库中的所有数据转储到filename。请注意,您应该在 unittest 运行时编辑测试数据库(因此是断点)。如果没有,即使您保留了测试数据库,它的所有数据也会在单元测试完成后被删除。
【讨论】:
test 用于确保我们可以dumpdata。但是还有其他方法可以防止这种情况发生吗?
test_mydatabase 数据库。如果你在test 数据库上运行测试,一个新的将创建名为 test_test_mydatabase 的数据库(这是您的意思吗?)。但是,如果您将 test 数据库仅用于转储数据,则不应创建新数据库...
MIRROR
您可以使用dumpdata 来生成一个 json 夹具,如下所示:
./manage.py dumpdata > fixture.json
如果您想从测试中保存一个夹具,只需序列化您的 qs:
# ... import your Models
from django.core.serializers import serialize
qs1 = Model1.objects.filter(...)
qs2 = Model2.objects.filter(...)
...
fixture = serialize('json', list(qs1) + list(qs2) + list(...))
with open('fixture.json', 'w') as f:
f.write(fixture)
【讨论】: