【问题标题】:Saving django test database in a fixture?将 django 测试数据库保存在夹具中?
【发布时间】:2014-10-27 13:42:28
【问题描述】:

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

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

【问题讨论】:

    标签: python django


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

    【讨论】:

    • 使用这种方法,测试用例将不必要地尝试在运行时重新创建附加配置文件的数据库。我知道test 用于确保我们可以dumpdata。但是还有其他方法可以防止这种情况发生吗?
    • 嘿@atjua,我们的想法是只在默认数据库上运行测试(实际上将创建test_mydatabase 数据库。如果你在test 数据库上运行测试,一个新的将创建名为 test_test_mydatabase 的数据库(这是您的意思吗?)。但是,如果您将 test 数据库仅用于转储数据,则不应创建新数据库...
    • @atjua 你需要在你的第二个数据库的配置中使用MIRROR
    【解决方案2】:

    您可以使用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)
    

    【讨论】:

    • 但这不是使用默认数据库吗?不是为运行测试自动生成的数据库?
    • 你在哪里创建测试数据库?
    • python manage.py testserver 会自动创建一个,见这里:docs.djangoproject.com/en/dev/ref/django-admin/…
    • 不,我的意思是您的测试数据库与您的生产数据库一起使用吗?
    • 我的开发机器上有一个生产数据库的本地副本。我不想删除那个数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    • 2011-03-10
    • 2011-06-07
    • 1970-01-01
    • 2021-12-08
    • 2011-03-08
    相关资源
    最近更新 更多