我们如何才能更快地进行Django测试?

时间:2014-03-24 14:28:17

标签: django postgresql django-testing in-memory-database django-tests

我们在Ubuntu 12.04上使用Django 1.4和PostgreSQL。我们有很多测试,问题是运行测试非常慢,我认为因为每次测试都是从头开始创建数据库。我希望通过在内存中使用数据库(而不是硬盘)来加快测试速度。我该怎么做?你有任何链接或教程吗?

6 个答案:

答案 0 :(得分:6)

在Django 1.9中,如果你有一个多核处理器,一个很好的选择是标志:

--parallel

这需要您pip install tblib,但可以让您在多个核心上同时运行单元测试。 (https://docs.djangoproject.com/en/1.10/ref/django-admin/#cmdoption-test-parallel

Django 1.8+的另一个不错的选择是标志:

--keepdb

它重用您的测试数据库,停止每次运行测试时创建新测试数据库所导致的漫长等待时间。 (https://docs.djangoproject.com/en/1.10/ref/django-admin/#cmdoption-test-keepdb

答案 1 :(得分:3)

最佳选择是为测试设置单独的设置文件。在settings_test.py中,您告诉它使用sqlite,默认情况下使用内存数据库:

from base_settings import *

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

然后通过添加--settings=settings_test

来运行测试

另见Django文档:
https://docs.djangoproject.com/en/dev/topics/testing/overview/#the-test-database

答案 2 :(得分:1)

您只需将测试数据库更改为sqlite:

import sys
if 'test' in sys.argv:
    DATABASES['default']['engine'] = 'sqlite3'

请注意,由于数据库之间存在某些不兼容性,您的某些测试可能会失败,但通常这应该可行。

答案 3 :(得分:1)

有几个SO线程很有帮助:

我绝对会使用SQLite技巧来进行健全性检查,但是如果你正在做任何特定于数据库的事情,它会让你疯狂:某些SQL差异,差异是数据精度等等。它也削弱了测试点:如果您正在使用测试来向您保证,一旦推送到生产中,更改将会起作用,针对不同的数据库运行它们并不是一个好方法。尝试使用nose尽可能跳过数据库重新创建并优化本地Postgres设置。您可以尝试avoiding the DB altogether as well.

对我来说最有效的方法是尝试将测试所造成的停机时间视为提供更好更改的机会,并鼓励我在启动测试运行器之前考虑我正在改变的内容。< / p>

答案 4 :(得分:1)

不熟悉python或Django,但从概念上讲,你应该能够:

  1. 在引导测试时创建数据库并加载一次
  2. 定义保存点。
  3. 在每个测试或测试组之后,回滚到该保存点。
  4. (如果它不支持保存点,您可能需要在测试期间覆盖ORM的开始/结束事务代码。)

    http://www.postgresql.org/docs/current/static/sql-savepoint.html

    (我在概念层面补充一点,你的DBAL和ORM应该在你的测试中被嘲笑,这样你就可以独立地测试你的组件。也就是说,你可能不应该这样做。 ;在大多数测试中都要连接到数据库。)

答案 5 :(得分:1)

快进到2016年,我们在manage.py中有一个非常好的option来加速测试。

  

- keepdb,-k¶   Django 1.8中的新功能。在测试运行之间保留测试数据库。这有利于跳过创建和   破坏可以大大减少运行测试时间的动作,   特别是在大型测试套件中。如果测试数据库没有   存在,它将在第一次运行时创建,然后为每个运行保留   后续运行。任何未应用的迁移也将应用于   在运行测试套件之前测试数据库。

如果您没有使用TransactionTestCase及其子类,则测试运行时间的很大一部分将来自数据库创建。如果你有大量的迁移,那将是非常糟糕的。但你用

来避免这一切
 ./manage.py test -k myapp