微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用PostgreSQL时,仅在单个测试中执行Django helper函数

如何解决使用PostgreSQL时,仅在单个测试中执行Django helper函数

最近,我已将数据库引擎从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()

解决方法

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

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

如果有人可以提供更详细的答案,为什么会发生,我将非常感谢。刷新时PostgreSQL中的ID计数器是否未清零?看起来会这样。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。