当我使用内置的SQLite作为我的数据库时,我的Django测试全部通过。但是,当我切换到内置的MySQL和PostgreSQL时,它们会失败。 (所有本地数据库服务器。)
与数据库的连接足够活跃 - 创建数据库并应用迁移。但是在测试服务器返回500之前测试甚至没有达到views.py
(除了“服务器错误”之外没有其他解释,即使在调试模式下也是如此)。
我正在使用Django和Django REST Framework,并使用REST Framework的RequestsClient
类进行测试。我的测试装置是由Factory Boy生成的。
有什么想法吗?我有一种模糊的感觉,它与Factory Boy有关,但没有什么具体的。事实上,它失败了多个数据库,并成功构建了表,这让我怀疑它不是数据库本身。
测试的版本:
答案 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=1
或Model.objects.last().pk
或在两者之间选择另一个实例来解决此问题。