【问题标题】:Running django tests with sqlite使用 sqlite 运行 django 测试
【发布时间】:2011-09-15 05:42:20
【问题描述】:

我使用 Postgres 进行生产和开发,但我想使用 sqlite 来运行一些测试。我没有看到一种简单的方法来配置一个引擎用于测试和另一个用于开发/生产。我错过了什么吗?

【问题讨论】:

标签: django django-testing


【解决方案1】:

在您的设置中添加以下行:

import sys
if 'test' in sys.argv or 'test_coverage' in sys.argv: #Covers regular testing and django-coverage
    DATABASES['default']['ENGINE'] = 'django.db.backends.sqlite3'

确保您的实际数据库设置在他们之前。

【讨论】:

  • 正如我在评论中所说,这基本上就是我现在正在做的事情。但是你不觉得这个解决方案有点糟糕吗?
  • 我在添加这篇文章后看到了您的评论 :) 不过,这个解决方案非常适合测试目的:您运行 manage.py 并带有“测试”参数,Python 通过 sys 将其传递给代码.argv,并且代码的行为相应。我在这里没有看到任何奇怪的东西,是吗?
  • 只要从命令行接收到“test”作为参数,该解决方案就会表现良好。 OTOH,你是对的,如果 django 提供了一种区分测试设置的方法,那就太好了。我们有比数据库设置更麻烦的问题,例如,如果您的测试在 MEDIA_ROOT 下操作目录或文件,那么您将需要一些 hacky 的东西。
  • 将 ENGINE 设置为 'django.db.backends.sqlite3' 以避免最新版本的 Django 出现弃用警告。
  • ^^ 并确保引擎大写:'ENGINE'
【解决方案2】:

这不是一个直接的答案,但是是的,您错过了一个大问题 - 在 SQLite 上测试 Postgres 应用程序很棘手 - 它们如此不同。我建议您创建一个 ram-disk(例如使用tmpfs)并在那里创建您的 Postgres 测试数据库。它不会像 SQLite 那样快,但可能比存储在 HDD 上的常规 Postgres 数据库快一个数量级。

【讨论】:

  • 嗯,大多数测试不会做任何与一个引擎不同的事情。根据我的经验,9/10(或更多)测试只使用最直接的管理器方法。因此,为了解决您的问题,我可以指定我想使用 postgres 的特定测试。但如果我只想在现场运行测试套件(而不是连接到数据库),我真的需要能够做到这一点。这是非常基本的。
  • 我没有得到这个答案。 Postgres 和 Sqlite 在哪些方面如此不同,以至于无法在 Sqlite 或其他数据库上可靠地测试典型的 Django 应用程序(我假设它使用 ORM)?我们不是在谈论与数据库无关的应用程序吗?
  • @shanyu:没有人强迫你相信我,如果你有不同的经历那我完全没问题。
  • 好的,让我重新考虑一下,将“无价值”这个词——它适合我一直在从事的项目——改为“棘手”。
  • @shanyu 如果应用在其中一个模型中有 JsonField 怎么办?这是一个很好的答案,因为它突出了 OP 计划中的缺陷,并提供了 OP 可能试图通过他们的计划解决的问题(即性能)的解决方案
【解决方案3】:

您可以尝试类似于 Zachary Voase 建议的设置: http://blog.zacharyvoase.com/2010/02/03/django-project-conventions/

(整个帖子很有用,但请向下滚动到“设置”部分,了解此处最相关的部分。)

Zach 的策略是创建一个设置文件夹并使用__init__.py 文件将其标记为python 包。然后,您可以为每种部署类型创建一个单独的子模块,其结构如下:

settings/
|-- __init__.py     # Empty; makes this a Python package
|-- common.py       # All the common settings are defined here
|-- development.py  # Settings for development
|-- production.py   # Settings for production
|-- staging.py      # Settings for staging

按照这个概念,您可以为 postgres 设置一个部署,为 sqlite 设置一个单独的部署,并根据需要分开每个配置。

【讨论】:

    【解决方案4】:

    我最终在我的 settings.py 中添加了以下内容。 --keepdb 将在 RAM 中设置 Sqlite DB。

    if 'test' in sys.argv:
        for db_test in ['default']: # Add other DBs if needed
            DATABASES[db_test]['ENGINE'] = 'django.db.backends.sqlite3'
            if '--keepdb' in sys.argv:
                DATABASES[db_test]['TEST']['NAME'] = '/dev/shm/' + db_test + '.test.db.sqlite3'
    

    【讨论】:

      猜你喜欢
      • 2010-10-11
      • 2011-07-14
      • 1970-01-01
      • 1970-01-01
      • 2018-09-02
      • 2023-03-23
      • 2015-06-28
      • 2023-03-03
      • 1970-01-01
      相关资源
      最近更新 更多