Django测试通过SQLite,与其他DB失败

时间:2018-01-30 18:44:25

标签: django django-rest-framework django-testing factory-boy

当我使用内置的SQLite作为我的数据库时,我的Django测试全部通过。但是,当我切换到内置的MySQL和PostgreSQL时,它们会失败。 (所有本地数据库服务器。)

与数据库的连接足够活跃 - 创建数据库并应用迁移。但是在测试服务器返回500之前测试甚至没有达到views.py(除了“服务器错误”之外没有其他解释,即使在调试模式下也是如此)。

我正在使用Django和Django REST Framework,并使用REST Framework的RequestsClient类进行测试。我的测试装置是由Factory Boy生成的。

有什么想法吗?我有一种模糊的感觉,它与Factory Boy有关,但没有什么具体的。事实上,它失败了多个数据库,并成功构建了表,这让我怀疑它不是数据库本身。

测试的版本:

  • Django 1.11.6和1.11.9
  • Django REST Framework 3.7.1
  • Postgres 10.1
  • MySQL 5.7.21
  • Factory Boy 2.9.2

3 个答案:

答案 0 :(得分:0)

原来是因为我正在使用的测试类。显然,尽管文档中没有说明,但Django REST框架RequestsClient类只能与DRF APILiveServerTestCase一起使用。这与SQLite一起工作是一个奇怪的侥幸。

链接:https://github.com/encode/django-rest-framework/issues/5801

根据Django documentation编辑添加,这就是“奇怪的侥幸”的原因:

  

当使用内存中的SQLite数据库来运行测试时,两个并行线程将共享相同的数据库连接:运行实时服务器的线程和运行测试用例的线程。 / p>

答案 1 :(得分:0)

我有一个类似的问题(不确定它是否相同)从SQLite到PostgreSQL。您是否使用安装方法来设置初始数据库对象?

实施例::

def setUp(self):
   user = User.objects.create_user(username='john', password='abbeyRd', email='john@thebeatles.com')
   user.save()

我发现这可以在SQLite上正常工作,但在PostgreSQL上我遇到数据库连接失败(它仍然会像你说的那样构建数据库,但是如果没有连接错误就无法运行测试)。

事实证明,修复方法是按如下方式运行您的设置方法:

@classmethod
def setUpTestData(cls):
    user = User.objects.create_user(username='john', password='abbeyRd', email='john@thebeatles.com')
    user.save()

我不记得这个有效的原因而另一个没有,但它与数据库的连接有关,试图重新连接每个测试,如果你使用setUp(self)并且如果你使用setUpTestData(cls)它只在实例化类时才连接,但我可能没有完美的细节。我真的知道它是否有效!

希望有所帮助,不确定它是否能解决您的确切问题,但我花了好几个小时才弄明白,所以我希望它能帮助您,也许将来会有其他人帮助您!

答案 2 :(得分:0)

我没有这个问题的确切答案,但是我遇到了类似的问题,其中 PostgreSQL 抱怨找不到包含{{1的 Foreign Key }}。发生这种情况是因为-在某些测试中-我已经将要测试的对象硬编码为具有id=1的对象。在 SQLite 上,此方法效果很好,因为ID是从1开始顺序给出的,但是,在 PostgreSQL 上却没有发生。当我需要使用主键时,可以通过使用id=1Model.objects.last().pk或在两者之间选择另一个实例来解决此问题。