Python 3.8+unittestпонятие
unittest.IsolatedAsyncioTestCase
тестирование
Базовый класс для тестов асинхронного кода: методы test_ могут быть async def, и каждый тест исполняется в собственном цикле событий.
Синтаксис
class MyTests(unittest.IsolatedAsyncioTestCase):
async def asyncSetUp(self): ...
async def test_x(self): ...
Подготовку с await пишут в asyncSetUp и asyncTearDown, а не в setUp: в обычном setUp await недоступен. Цикл событий новый на каждый тест, поэтому объект, привязанный к циклу (asyncio.Lock, Queue, клиентское соединение), созданный в setUpClass или на уровне модуля, в тесте ломается. Звать asyncio.run() внутри такого теста нельзя — цикл уже запущен, будет RuntimeError.
Примеры
import asyncio
import sys
import unittest
async def double(x):
await asyncio.sleep(0)
return x * 2
class DoubleTests(unittest.IsolatedAsyncioTestCase):
async def asyncSetUp(self):
self.value = await double(5)
async def test_double(self):
self.assertEqual(self.value, 10)
suite = unittest.TestLoader().loadTestsFromTestCase(DoubleTests)
result = unittest.TextTestRunner(stream=sys.stdout, verbosity=0).run(suite)
print(result.wasSuccessful()) # → True
См. также
Частые ошибки
Открыть в полном глоссарииdocs.python.orgСообщить о неточности