【问题标题】:Accelerate unittest in Django在 Django 中加速单元测试
【发布时间】:2011-12-31 03:26:07
【问题描述】:

我发现执行单元测试很慢,尤其是 Django 中的数据库操作。

它经历了创建数据库,表,夹具,然后测试,最后销毁它们的整个过程。

我什至花了将近半分钟的时间来完成所有这些事情。

在不考虑我的机器速度的情况下,有没有其他方法可以在 Django 中加速单元测试或任何加速技巧?

【问题讨论】:

  • 既然你说运行测试需要大约 30 秒,我假设你已经在运行你的应用程序的测试(而不是整个 django 测试套件)。有了这个假设,要消除的瓶颈可能是 sqlite(这很慢)。我建议安装本地 postgres/mysql 服务器并改用它。
  • @OwenNelson:奇怪的是,SQLite 极大地提升了 Django 测试的速度。轻松将 45-50 秒的测试套件缩短到 7-10 秒
  • @OwenNelson,我正在使用 MySQL,不是在我的机器上,而是在 LAN 中的远程主机上。也许,在我的机器上移动数据库服务器会很好。谢谢提醒。
  • @Javier 听说 sqlite 对您来说更快,我很惊讶。一般来说,由于它是一个无服务器、基于磁盘的实现,因此在处理大量插入/更新/删除(对于大型固定装置集很自然)时,您会遇到磁盘/文件争用问题(等待锁定)。在您有固定数据的情况下,我经常发现实际的 RMDB 速度要快得多。 **我这么说是假设夹具数据足够大以至于不能在 :memory: 中运行 sqlite,当然。

标签: django performance unit-testing


【解决方案1】:

当我想运行测试时,我要做的是切换到 SQLite。在 SQLite 中设置测试数据库所需的时间要少得多。

您可以使用修改后的设置文件轻松完成此操作:

$ python manage.py test my_app --settings=test_settings

或者在我的情况下,

$ python manage.py test my_app --settings=settings.test

因为我使用“设置作为一个包”方案。

【讨论】:

  • 谢谢,我会试试的。但是在此之前,我该如何处理MySQL和SQLite之间的不兼容问题,因为很多db操作都是在原始sql中完成的。
  • @xiaohan2012,很遗憾,这个解决方案对你没有帮助。
【解决方案2】:

您可以在 sqlite db stored in memory 中加速运行测试

    DATABASES['default'] = {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': ':memory:'
    }

【讨论】:

    【解决方案3】:

    看看this article。它有许多有用的提示,例如:

    • 将密码哈希函数更改为 MD5(对我来说有很大的改进)。
    • 使用更快的内存数据库。
    • 禁用不需要的应用程序和中间件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-13
      • 2014-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      • 2021-10-11
      相关资源
      最近更新 更多