У FastAPI есть тестовый клиент. Он берет луп и запускает его снова. Логично, что это приводит к ошибке. В FastAPI рекомендуют использовать синхронные тесты, объясняя это тем, что тогда не надо будет никакие pytest-asyncio юзать. Но, к сожалению, в тестах дергаются асинхронные функции, и сделать их полностью синхронными не выйдет.
Мы используем тестового клиента starlette, но для behave тестов. Тоже приходится делать асинхронные тестовые методы (шаги, т.е.). behave предоставляет декоратор для асинхронщины, куда подставляется текущий луп. Тот же самый луп берётся и в тестовом клиенте