我有一个包含大量数据的生产数据库。我想使用一些数据来运行单元测试,但是在测试过程开始时,为了构建数据库,所有这些都会导致相当长的时间。我想避免这种情况。
我使用manage.py testserver
命令创建了一个测试数据库,然后删除了我想通过管理界面包含的所有数据。如何创建保留在默认测试数据库中的数据夹具?
答案 0 :(得分:4)
您可以使用dumpdata
生成json fixture,如下所示:
./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)
答案 1 :(得分:1)
现在更容易将测试数据保存到夹具中。
运行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运行时编辑测试数据库(因此要设置断点)。如果没有,即使您保留测试数据库,在完成单元测试后,所有数据也会被删除。