【问题标题】:Speeding up Django unittests with a template Sqlite database使用模板 Sqlite 数据库加速 Django 单元测试
【发布时间】:2014-08-26 06:12:26
【问题描述】:

如何让 Django 在运行单元测试时将 sqlite3 db 文件加载到内存中,而不是生成新数据库并从头开始初始化架构?

我有一些大型 JSON 固定装置,Django 需要一段时间才能为每个测试加载。我想的一种解决方法是生成一个“模板”sqlite3 数据库,将所有模式和夹具加载到其中,然后简单地将其用于每个单元测试,绕过所有夹具加载。显然,每当我更改架构或固定装置时,我都必须更新此模板,但如果这意味着每个单元测试将需要几秒钟而不是几分钟来运行,那么这是一个可以接受的折衷。

我已经完成了第一步,生成了模板数据库,方法是: * 在“TEST_NAME”数据库设置字段中指定 db 文件名 * 运行一个什么都不做的特定单元测试,所以 Django 只会生成模式和加载夹具 * monkeypatched django.test.running.DiscoverRunner.teardown_databases 什么都不做,所以我可以检索 db 文件并将其保存为我的数据库模板

但是现在我被困在如何让 Django 使用这个文件上。如果我将文件保留为我的 TEST_NAME 参数,Django 将简单地删除它并重新生成它......但还会继续将它写入文件系统,使其比内存中的 Sqlite3 数据库慢近 10 倍。

【问题讨论】:

    标签: python django sqlite django-unittest


    【解决方案1】:

    settings.py 文件的末尾添加:

    if 'test' in sys.argv:
        # If you also want to speed up password hashing in test cases.
        PASSWORD_HASHERS = (
            'django.contrib.auth.hashers.MD5PasswordHasher',
        )
        # Use SQLite3 for the database engine during testing.
        DATABASES['default'] = {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': '', # Add the name of your SQLite3 database file here.
            }
    

    【讨论】:

    • 我不是在问如何使用内存中的 sqlite3 数据库。正如我在问题中提到的,我已经在这样做了。我在问如何将特定的 sqlite3 数据库文件复制到内存中。
    • 这可能有点晚了,但我发现了这个:docs.djangoproject.com/en/1.6/topics/testing/advanced/… 您可能可以设置自己的setup_databases 函数,让您使用您创建的数据库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 2014-09-14
    • 2019-02-14
    相关资源
    最近更新 更多