Python 3.10下如何实现setUpClass的异步等效功能?
类级别异步测试固件的实现方案
方案一:基于unittest原生扩展
由于IsolatedAsyncioTestCase没有官方提供异步版的类级别 setUp/TearDown,你可以直接在同步的setUpClass和tearDownClass里,用asyncio.run()包裹异步逻辑来实现。初始化后的固件可以存在类属性中,供该类所有测试方法共享。
示例代码:
import unittest import asyncio class TestMyAsyncClass(unittest.IsolatedAsyncioTestCase): # 存储类级别异步固件 class_fixture = None @classmethod def setUpClass(cls): # 在同步类方法里执行异步初始化 cls.class_fixture = asyncio.run(cls._async_class_setup()) @classmethod def tearDownClass(cls): # 在同步类方法里执行异步清理 asyncio.run(cls._async_class_teardown()) @classmethod async def _async_class_setup(cls): # 实际的异步初始化逻辑,比如建立异步连接、预加载资源 await asyncio.sleep(0.5) return "shared async resource" @classmethod async def _async_class_teardown(cls): # 实际的异步清理逻辑,比如关闭连接、释放资源 await asyncio.sleep(0.5) cls.class_fixture = None async def test_first_case(self): self.assertEqual(self.class_fixture, "shared async resource") async def test_second_case(self): self.assertIsNotNone(self.class_fixture)
方案二:用pytest类级别异步Fixture(更推荐,适配你的环境)
既然你已经在用pytest,直接用它的异步Fixture功能更简洁。设置scope="class"就能让固件在每个测试类中仅初始化和清理一次,pytest会自动处理异步逻辑的调度,不需要手动调用asyncio.run()。
示例代码:
import pytest import asyncio # 定义类级别异步固件 @pytest.fixture(scope="class") async def shared_class_fixture(): # 异步初始化步骤 await asyncio.sleep(0.5) fixture_data = "shared async resource" yield fixture_data # 异步清理步骤 await asyncio.sleep(0.5) # 测试类(无需继承unittest类,纯pytest风格) class TestMyAsyncClass: async def test_first_case(self, shared_class_fixture): assert shared_class_fixture == "shared async resource" async def test_second_case(self, shared_class_fixture): assert shared_class_fixture is not None
如果要保留IsolatedAsyncioTestCase的写法,方案一完全兼容pytest运行环境;如果转向纯pytest测试风格,方案二更符合pytest的设计哲学,代码也更简洁。
内容的提问来源于stack exchange,提问作者vxxxi
相关产品推荐
相关产品推荐

