gpt4 book ai didi

Django 单元测试 : threads in TestCase do not see the records but TransactionTestCase ones do

转载 作者:行者123 更新时间:2023-12-01 11:36:52 25 4
gpt4 key购买 nike

鉴于此代码:

class ImportTest(TestCase):

account = None

def test_atomic(self):

def import_task():
print Account.objects.all()

threads = []
self.account = Account.objects.create(name='abc')
for i in range(10):
t = threading.Thread(target=import_task)
threads.append(t)
t.start()

for t in threads:
t.join()

线程打印空记录集,但如果我让它扩展 TransactionTestCase如下:
class ImportTest(TransactionTestCase):

account = None

def test_atomic(self):

def import_task():
print Account.objects.all()

threads = []
self.account = Account.objects.create(name='abc')
for i in range(10):
t = threading.Thread(target=import_task)
threads.append(t)
t.start()

for t in threads:
t.join()

这将打印出创建的记录。

有人可以解释这种行为吗?

最佳答案

因为 TestCase在事务内部运行(这是一个旨在提高性能的实现细节),您不应该将它用于任何本身测试或依赖事务的事情。这在 documentation 中有解释.

在这种情况下发生的事情可能与数据库和隔离级别有关,但我的猜测是:测试在打开的事务中运行,因为您使用的是 TestCase ;该事务保持打开状态,直到测试结束并回滚;线程正在创建自己的数据库连接;并且由于隔离级别,他们无法看到在仍然打开的主事务中创建的对象。

好消息是您已经找到了解决方案:使用 TransactionTestCase .测试过程将在常规自动提交模式下运行,因此 create()在其他线程进行查找之前提交到数据库。

关于Django 单元测试 : threads in TestCase do not see the records but TransactionTestCase ones do,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26050755/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com