将django测试数据库保存在夹具中?

时间:2014-10-27 13:42:29

标签: python django

我有一个包含大量数据的生产数据库。我想使用一些数据来运行单元测试,但是在测试过程开始时,为了构建数据库,所有这些都会导致相当长的时间。我想避免这种情况。

我使用manage.py testserver命令创建了一个测试数据库,然后删除了我想通过管理界面包含的所有数据。如何创建保留在默认测试数据库中的数据夹具?

2 个答案:

答案 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运行时编辑测试数据库(因此要设置断点)。如果没有,即使您保留测试数据库,在完成单元测试后,所有数据也会被删除。