当前位置: 首页 > 面试题库 >

Django单元测试需要很长时间才能创建测试数据库

訾凯歌
2023-03-14
问题内容

现在一段时间以来,我的单元测试花费的时间比预期的长。我已经尝试调试了几次,但是没有成功,因为延迟是在我的测试甚至开始运行之前。这影响了我在远程测试驱动开发附近做任何事情的能力(也许我的期望太高了),所以我想看看我是否可以一劳永逸地解决这个问题。

运行测试时,测试的开始与实际开始之间会有70到80秒的延迟。例如,如果我针对一个小模块运行测试(使用time python manage.py test myapp),我得到

<... bunch of unimportant print messages I print from my settings>

Creating test database for alias 'default'...
......
----------------------------------------------------------------
Ran 6 tests in 2.161s

OK
Destroying test database for alias 'default'...

real    1m21.612s
user    1m17.170s
sys     0m1.400s

1m:21中的大约1m18位于

Creating test database for alias 'default'...

.......

线。换句话说,测试花费了不到3秒的时间,但是数据库初始化似乎花费了1:18min

我大约有30个应用程序,大多数应用程序具有1到3个数据库模型,因此这应该可以使您了解项目的规模。我使用SQLite进行单元测试,并实现了一些建议的改进。我无法发布整个设置文件,但很高兴添加所需的任何信息。

我确实使用亚军

from django.test.runner import DiscoverRunner
from django.conf import settings

class ExcludeAppsTestSuiteRunner(DiscoverRunner):
    """Override the default django 'test' command, exclude from testing
    apps which we know will fail."""

    def run_tests(self, test_labels, extra_tests=None, **kwargs):
        if not test_labels:
            # No appnames specified on the command line, so we run all
            # tests, but remove those which we know are troublesome.
            test_labels = (
                'app1',
                'app2',
                ....
                )
            print ('Testing: ' + str(test_labels))

        return super(ExcludeAppsTestSuiteRunner, self).run_tests(
                test_labels, extra_tests, **kwargs)

在我的设置中:

TEST_RUNNER = 'config.test_runner.ExcludeAppsTestSuiteRunner'

我也尝试过django-nosedjango-nose-exclude

我已经阅读了很多有关如何加快测试速度的文章,但是还没有找到有关如何优化或避免数据库初始化的线索。我已经看到了有关不尝试使用数据库进行测试的建议,但是我无法或不知道如何完全避免这种情况。

请让我知道

  1. 这是正常现象
  2. 没料到(希望能解决该问题或指导如何做)

同样,我不需要帮助自己加快测试速度,而需要初始化(或开销)。我希望上面的示例花费10秒而不是80秒。

非常感谢

我使用来运行测试(针对单个应用程序),--verbose 3发现这与迁移有关:

  Rendering model states... DONE (40.500s)
  Applying authentication.0001_initial... OK (0.005s)
  Applying account.0001_initial... OK (0.022s)
  Applying account.0002_email_max_length... OK (0.016s)
  Applying contenttypes.0001_initial... OK (0.024s)
  Applying contenttypes.0002_remove_content_type_name... OK (0.048s)
  Applying s3video.0001_initial... OK (0.021s)
  Applying s3picture.0001_initial... OK (0.052s)
  ... Many more like this

我压缩了所有的迁移,但速度仍然很慢。


问题答案:

解决我问题的最终解决方案是强制Django在测试期间禁用迁移,这可以通过如下设置完成

TESTING = 'test' in sys.argv[1:]
if TESTING:
    print('=========================')
    print('In TEST Mode - Disableling Migrations')
    print('=========================')

    class DisableMigrations(object):

        def __contains__(self, item):
            return True

        def __getitem__(self, item):
            return "notmigrations"

    MIGRATION_MODULES = DisableMigrations()

或使用https://pypi.python.org/pypi/django-test-without-
migrations

我的整个测试现在大约需要1分钟,而一个小应用程序则需要5秒。

就我而言,在迁移时更新测试时不需要进行迁移,并且不使用迁移来添加数据。这并不适合所有人



 类似资料:
  • 我启动了一个项目,现在项目中有大约7个测试,使用执行整个测试套件已经花费了一分钟多的时间。 从附加输出(标志)中,我可以看到,对于每个测试类和方法,整个quarkus应用程序以及mongodb实例等依赖项都会重新启动。 这与quarkus文档在测试指南页面上的内容完全相反: 到目前为止,在我们的所有示例中,我们只为所有测试启动Quarkus一次。在运行第一个测试之前,Quarkus将启动,然后所有

  • 问题内容: 我正在使用Hibernate 4.2,JPA 2.0和Postgres 9.2 代码卡在 在进一步调查中,我发现Hibernate调用了class 方法。此方法尝试加载有关每个数据库对象的元数据 的代码是Postgers的JDBC驱动程序的一部分,而确实是花费时间来执行该方法的驱动程序(我加载了驱动程序源并尝试了跟踪)。但是由于这个问题在Hibernate 3.3(我之前使用过)中没有

  • 为了让单元测试跑一个批处理的任务,这个框架必须加载这个任务的ApplicationContext,两个注解的触发方式: @RunWith(SpringJUnit4ClassRunner.class):表明这个类需要使用Spring的测试工具 @ContextConfiguration(locations = {…}):表明哪些xml文件包含ApplicationContext @RunWith

  • 我在测试方面有问题。这是我第一次写测试,我遇到了一个问题。 我刚刚在我的应用程序中创建了一个测试文件夹,并且用于测试URL。 当我键入: 它说: 创建别名默认的测试数据库...创建测试数据库时出错:数据库"database_name"已经存在 如果要尝试删除测试数据库“database_name”,请键入“yes”,或键入“no”取消: 这是什么意思?如果我输入yes会发生什么?我是否丢失了数据库

  • 我正在我的Android应用程序中创建钱包,使用库Web3j:https://web3j.io/ 参见代码: 它正在正确创建钱包,问题是这个过程需要很长时间,大约10分钟。 我做错什么了吗? 有没有其他方法可以让它更快?