【问题标题】:Django helper function executed only in single test when PostgreSQL used使用 PostgreSQL 时,Django 辅助函数仅在单个测试中执行
【发布时间】:2020-08-15 12:42:20
【问题描述】:

最近我将数据库引擎从SQLite 更改为PostgreSQL。我已经成功地将整个数据库设计迁移到 PostgreSQL(只是简单的 makemigaretions,迁移)。一旦我运行了一些测试,一些未知的原因就失败了(错误表明一些对象没有被创建)。失败并不适用于所有测试,只是选择了几个。之前一切正常。

我会开始逐个测试调查发生的情况,但出现了一些奇怪的行为。假设我的测试在 MyTestClass 类中,测试名为 test_do_something,在 MyTestClass 中还有其他测试。

  1. 当我运行python manage.py test MyTestClass 时,我收到test_do_something 失败的信息。
  2. 当我运行 python manage.py test MyTestClass.test_do_something 时,一切都会过去。
  3. 在 SQLite 上,两种方式都可以通过。

我假设 setUpTestData()setUp() 方法在 SQLite 和 PostgreSQL 中的工作方式相同。或者他们没有?

知道为什么会出现这种差异吗?

编辑

我想我已经注意到可能出了什么问题,但我不明白为什么。问题是因为我曾经调用过我的函数来创建对象,该对象后来只使用一次。这与SQLite 执行不同。

我在测试中的意思是这样的:

def create_object(self):
    self.client.post(reverse('myurl'), kwargs={'myargs':arg})

def test_mytest1(self):
    # Do something
    self.create_object()
    # Do something

def test_mytest2(self):
    # Do something
    self.create_object()
    # Do something

def test_mytest3(self):
    # Do something
    self.create_object()
    # Do something

只有一个测试create_object()会被执行。

【问题讨论】:

  • 您确定每次运行时都会创建 测试数据库吗?
  • @ArakkalAbu 是的,我已经考虑过了。但是当我跑步时,例如#2 然后 #1 然后 #2 或任何其他执行模式的顺序总是重复。而且我没有使用--keepdb。根据每次运行之间的文档,flush 应该自动执行。
  • 我认为您应该添加有关该问题的更多信息,例如您遇到了什么错误,是否可重现等。也许,如果您这样做,其他人可以提供帮助
  • @ArakkalAbu 我已经更新了更多细节的问题。

标签: django django-testing django-postgresql


【解决方案1】:

我相信我很喜欢这些失败的原因。事实上,正如我所料,一次性执行支持功能并不是问题。问题出在我出于各种原因使用的硬编码 ID 上。我一直希望看到的对象似乎不存在。

让我再解释一下我的经历。例如。我已经测试了我在 URL kwargs 中引用传递此对象 id 的特定对象的位置。在此操作之前,我创建了对象并将id=1 作为 kwargs 传递,因为我假设如果这仅在此测试中放置,setUp() 它将是 1。使用 PostgreSQL 似乎不是很清楚。尽管数据库刷新,但似乎 id 会增加。这与 SQLite 提供的行为完全不同。

如果有人能提供更详细的答案,我将不胜感激。刷新时 PostgreSQL 中的 ID 计数器是否未归零?看起来会这样。

【讨论】:

    猜你喜欢
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    • 2017-01-06
    • 2012-04-22
    • 1970-01-01
    相关资源
    最近更新 更多