决定将Python版本从3.10升级到3.11,之前我们使用的是
asynctest.TestCase
,它有setUp
和tearDown
方法,并且支持异步代码的测试。
我已经检查过
unittest.IsolatedAsyncioTestCase
,但它为每个测试使用不同的事件循环,这导致使用我们现在无法承受的不同会话。
我们正在使用 async
setUp
/ asyncSetUp
来初始化依赖项并创建测试数据,因此需要此功能。
有类似的吗?或者您使用什么来使用 python 3.11 / 3.12 测试复杂系统?
p.s
asynctest.TestCase
3.11+ 不支持
我想知道是否有使用 python 3.11/3.12 测试异步代码的专业知识。 也许有人也面临着我的问题。
asynctest.TestCase
,并且unittest.IsolatedAsyncioTestCase
确实为每个测试创建一个新的事件循环。一种可能的替代方法是创建一个自定义测试用例类,该类可以扩展unittest.TestCase
并手动管理事件循环。这将允许您对所有测试使用相同的事件循环,类似于
asynctest.TestCase
的工作方式。
import asyncio
import unittest
class AsyncTestCase(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.loop = asyncio.new_event_loop()
asyncio.set_event_loop(cls.loop)
@classmethod
def tearDownClass(cls):
cls.loop.close()
def setUp(self):
self.loop.run_until_complete(self.asyncSetUp())
def tearDown(self):
self.loop.run_until_complete(self.asyncTearDown())
async def asyncSetUp(self):
# Async setup code here
pass
async def asyncTearDown(self):
# Async teardown code here
pass
def run_async(self, coro):
return self.loop.run_until_complete(coro)
使用 run_async
方法运行异步测试。实现
asyncSetUp
和
asyncTearDown
来设置和拆除每个测试。例如,在测试中使用它是:
class MyAsyncTestCase(AsyncTestCase):
async def asyncSetUp(self):
# Async setup code specific to your tests
self.some_resource = await create_async_resource()
async def asyncTearDown(self):
# Async teardown code specific to your tests
await self.some_resource.close()
async def test_something(self):
# Your async test code
result = await self.some_resource.do_something()
self.assertEqual(result, expected_value)