用sqlite运行django测试

jMy*_*les 30 django django-testing

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

sha*_*nyu 42

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

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'
Run Code Online (Sandbox Code Playgroud)

确保您的实际数据库设置在它们之前.

  • 将ENGINE设置为'django.db.backends.sqlite3'以避免使用最新版本的Django的弃用警告. (8认同)
  • ^^并确保引擎处于大写字母:'ENGINE' (5认同)
  • 正如我在评论中所说,这基本上就是我现在正在做的事情。但是你不觉得这个解决方案有点糟糕吗? (2认同)
  • 只要此解决方案从命令行接收“test”作为参数,它就会表现良好。OTOH 你是对的,如果 django 提供了一种区分测试设置的方法,那就太好了。在那里,我们遇到了比数据库设置更麻烦的问题,例如,如果您的测试操作 MEDIA_ROOT 下的目录或文件,那么您将需要一些hacky 的东西。 (2认同)

Tom*_*ski 8

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

  • 我没有得到这个答案.Postgres和Sqlite在哪些方面如此不同,以至于典型的Django应用程序(我假设它使用的是ORM)无法在Sqlite或其他数据库上可靠地进行测试?我们不是在谈论与数据库无关的应用程序吗? (11认同)
  • @shanyu 如果应用程序在其中一个模型中有一个 JsonField 怎么办?这是一个很好的答案,因为它突出了 OP 计划中的一个缺陷,并提供了一个解决方案,即 OP 可能试图通过他们的计划(即性能)解决的问题 (2认同)