Как запустить асинхронные тестовые примеры в цикле for с помощью среды модульного тестирования Python?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как запустить асинхронные тестовые примеры в цикле for с помощью среды модульного тестирования Python?

Сообщение Anonymous »

Я пытаюсь запустить асинхронный тестовый пример в цикле с помощью среды модульного тестирования Python; однако я натыкаюсь на кирпичную стену с ошибкой: AssertionError: бегун asyncio уже инициализирован
В рамках моего цикла мне нужно повторно инициализировать набор тестов следующим образом: :

Код: Выделить всё

tests = get_tests()
suite = unittest.TestSuite(tests)
runner = unittest.TextTestRunner()

for _ in range(3):
result = runner.run(suite)
unittest.registerResult(result)
suite = unittest.TestSuite(tests)
Тест, вызывающий проблемы (минимальная версия):

Код: Выделить всё

async def basic_async_func():
await asyncio.sleep(2)
return 'hello'

class MyAsyncTestClass(unittest.IsolatedAsyncioTestCase):

@classmethod
def setUpClass(cls):
cls.name = 'foo'
# Handling async class set up
asyncio.run(cls.asyncSetUpClass())

@classmethod
async def asyncSetUpClass(cls):
cls.statement = await basic_async_func()

def test_set_up(self):
self.assertEqual(self.statement,'hello')

Я получаю следующий результат:

Код: Выделить всё

Traceback (most recent call last):
File "/home/main.py", line 151, in 
main()
File "/home/main.py", line 116, in main
test_result = runner.run(single_suite)
^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.12/unittest/runner.py", line 240, in run
test(result)
File "/usr/lib/python3.12/unittest/suite.py", line 84, in __call__
return self.run(*args, **kwds)
^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.12/unittest/suite.py", line 122, in run
test(result)
File "/usr/lib/python3.12/unittest/case.py", line 690, in __call__
return self.run(*args, **kwds)
^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.12/unittest/async_case.py", line 129, in run
self._setupAsyncioRunner()
File "/usr/lib/python3.12/unittest/async_case.py", line 120, in _setupAsyncioRunner
assert self._asyncioRunner is None, 'asyncio runner is already initialized'
^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: asyncio runner is already initialized
Я попробовал несколько разных способов решить эту проблему.
Во-первых, я изначально вручную установил цикл событий:

Код: Выделить всё

cls.loop = asyncio.new_event_loop()
asyncio.set_event_loop(cls.loop)
cls.loop.run_until_complete(cls.asyncSetUpClass())
Во-вторых, я попробовал использовать контекстный менеджер asyncio.runner:

Код: Выделить всё

with asyncio.Runner() as runner:
runner.run(cls.asyncSetUpClass())
Наконец, я попытался удалить метод classSetUp (хотя это было требованием моего фактического, неминимального тестового примера) и вместо этого просто использовать функцию asyncSetUp ИзолированныеAsyncioTestCase :

Код: Выделить всё

async def asyncSetUp(self):
self.name = 'foo'
self.statement = await basic_async_func()
Все они выдали ту же ошибку, что и выше. Мне интересно, нужно ли мне каким-то образом установить или закрыть бегун asyncio на уровне цикла в первом блоке кода? (Я пробовал повторно инициализировать модуль unittest на каждой итерации цикла, но это не сработало)

Подробнее здесь: https://stackoverflow.com/questions/790 ... -framework
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»