如何将Django测试数据库保存为测试数据?

7 投票
2 回答
3482 浏览
提问于 2025-04-29 22:18

我有一个生产数据库,里面存了很多数据。我想用其中一些数据来进行单元测试,但如果把所有数据都拿来,就会导致测试开始时需要花很长时间来建立数据库,这我想避免。

我使用 manage.py testserver 命令创建了一个测试数据库,然后通过管理界面删除了我不想要的数据。请问我该如何创建一个只包含默认测试数据库中剩余数据的固定数据集呢?

暂无标签

2 个回答

5

现在将测试数据保存到一个固定的地方变得更简单了。

当你运行 Django 的单元测试时,系统会自动创建一个以 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'}
    }
}

然后运行一个单元测试,在第一行设置一个断点,随意编辑测试数据库,接着运行以下命令:

./manage.py dumpdata app_name -o filename.json --database test

这个命令会把 test 数据库中的所有数据导出到 filename 文件中。注意,你应该在单元测试运行的时候编辑测试数据库(所以要设置断点)。如果不这样做,即使你保留了测试数据库,所有数据在单元测试完成后也会被清空。

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)

撰写回答