Django 3.0—;异步测试后数据库连接未关闭
我在异步代码中使用Django ORM。一切正常,所有测试都通过。但是,测试后DB连接不能正确关闭。以下是一个例子:Django 3.0—;异步测试后数据库连接未关闭,django,python-asyncio,django-channels,django-tests,asgi,Django,Python Asyncio,Django Channels,Django Tests,Asgi,我在异步代码中使用Django ORM。一切正常,所有测试都通过。但是,测试后DB连接不能正确关闭。以下是一个例子: from asgiref.sync import sync_to_async, async_to_sync @sync_to_async def count_books(): return Book.objects.count() class FooTest(TestCase): def setUp(self): Book.objects.
from asgiref.sync import sync_to_async, async_to_sync
@sync_to_async
def count_books():
return Book.objects.count()
class FooTest(TestCase):
def setUp(self):
Book.objects.create(title='Haha')
def test1(self):
import asyncio
c = asyncio.run(count_books())
self.assertEqual(1, c)
def test2(self):
c = async_to_sync(count_books)()
self.assertEqual(1, c)
Postgres错误:
django.db.utils.OperationalError: database "test_mydbname" is being accessed by other users
Sqlite错误:
sqlite3.OperationalError: database table is locked: test_mydbname
我曾尝试从django频道将sync\u切换到\u async
与database\u sync\u切换到\u async
,但这没有改变任何事情
如何修复此问题?问题在于异步运行循环如何与主线程交互,自己处理此问题会变得相当复杂 对于测试
django通道
我建议使用pytest
和pytest asyncio
来测试通道。当然还有pytest django
这将为测试异步代码提供一些有用的工具
@pytest.mark.django_db(事务=True)
@pytest.mark.asyncio
异步def test1():
count=等待数据库同步到异步(Book.objects.count)
....
有关如何测试通道代码的一些示例,请查看。谢谢!如果我根本不使用django通道呢?我发现我需要测试异步python
pytest asyncio
应该是你的目标,Pytest非常灵活,也可以调用常规的python UnitTest类,因此您可以保留非异步代码的现有测试代码,Pytest会很高兴地调用它。关于django3(orm访问),django还没有提供与数据库同步到异步的等价物您是否尝试使用django3.0?