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

Bar*_*vbl 5 python django

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

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

Anz*_*zel 5

您可以使用它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)
Run Code Online (Sandbox Code Playgroud)


Fel*_*rri 5

现在可以更轻松地将测试数据保存到夹具中。

当您运行 django 单元测试时,会通过在默认数据库名称前test添加一个数据库来自动创建数据库。test_我们可以通过在 上创建一个新数据库来让 django 知道这个数据库settings.py。例如

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'}
    }
}
Run Code Online (Sandbox Code Playgroud)

然后运行单元测试,在第一行设置断点,根据需要编辑测试数据库,然后运行以下命令:

./manage.py dumpdata app_name -o filename.json --database test
Run Code Online (Sandbox Code Playgroud)

这会将test数据库中的所有数据转储到filename. 请注意,您应该在单元测试运行时编辑测试数据库(因此是断点)。如果没有,即使您保留测试数据库,其所有数据也会在单元测试完成后被删除。