Python 3.11。异步测试运行器

问题描述 投票:0回答:1

决定将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 测试异步代码的专业知识。 也许有人也面临着我的问题。

python pytest python-unittest python-3.11 python-3.12
1个回答
0
投票

在Python 3.11中,确实不支持

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)
    
© www.soinside.com 2019 - 2024. All rights reserved.