УРОКИ FASTAPI НА БОЕВОМ СЕРВИСЕ 2. РЕФАКТОРИНГ СТРУКТУРЫ ПРОЕКТА, НАПИСАНИЕ ПЕРВОГО ТЕСТА
ฝัง
- เผยแพร่เมื่อ 5 พ.ค. 2024
- В этом ролике отрефакторим структуру нашего проекта, а также заложим инфрастуктурную базу для тестов и напишем первый из них.
00:00 Введение
01:00 Чем займемся в этом ролике?
02:35 Как изменилась структура проекта
08:00 Использование Depends для получения объекта для работы с БД в рамках запроса
13:03 Добавление инстанса тестовой БД в docker-compose файл
15:05 Makefile для управления контейнерами
18:30 Дебаг Depends
20:50 Написание файла conftest для тестов
40:20 Написание теста на хэндлер создания пользователя
46:25 Пытаемся поломать тесты
48:25 Заключение
Поддержать:
www.donationalerts.com/r/luch...
boosty.to/luchanos
На других платформах:
/ luchanos
/ @luchanos
Ссылка на проект - github.com/luchanos/luchanos_...
Канал «luchanos | Balabol IT» в Телеге - t.me/balabol_it
Присоединяйся к нашему чату в Телеге - t.me/luchanos_live_chat
Я в linkedin - www.linkedin.com/in/luchanos
Страница компании - / luchanos
Репозиторий-сокровищница - github.com/luchanos/treasury
#ityoutubers #ityoutubersru
Актуальный хэш коммита - 2e719cacb228d118c78c444caec2d284a22e4e4a
ВНИМАНИЕ! Если будете воспроизводить у себя, то обязательно клонируйте мой репозиторий и обратите внимание на файл requirements.txt - там могут быть зависимости, про которые я не упомянул в ролике, нужно будет их поставить через
pip install -r requirements.txt
Отличное видео
Не забывайте пожалуйста указывать хэш актуального коммита в описании к видео 😄
Е
Спасибо за видео👍
Супер. Лайк, подписка🙂
Спасибо, Миша!!
АйТиБалабол) продолжение надо) очень классный материал могу в опенсорс писать тесты)
Интересно 👍
кайфанул
Thanks!
Спасибо за твой труд!
Ждём ещё видео
Для синхронизации тестовой бд с реальной можно использовать такую фикстуру
@pytest.fixture(autouse=True, scope='session')
async def prepare_database():
async with test_engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all)
yield
async with test_engine.begin() as conn:
await conn.run_sync(Base.metadata.drop_all)
И не надо будет запариваться с миграциями алембика и создавать папку с ними.
класс
Ура!
Лучшее что я видел по Fastapi !
Спасибо за отличный ролик. Скачал код. Но без подсказки в комментах, что надо использовать pytest-asyncio==0.18.3 не мог запустить
В очередной раз актуалочка подъехала
20:30 почему тут не сделать
'async with async_session() as session:
yield session' ?
Тут всетаки непонятно как у тебя тесты проходят нормально у меня при попытка сноса таблиц таким образом выдает ошибку
E sqlalchemy.exc.ArgumentError: Textual SQL expression 'TRUNCATE TABLE users' should be explicitly declared as text('TRUNCATE TABLE users')
а если пробовать через SQL Alchemy Text() то как ты и говорил начинается какаято херня с лупами.
У меня есть подозрение что пичарм сам както загоняет в pytest эту строку в обход нытью SQLAlchemy, что через командную строку добится не получается, если через text() вводить то лупы залупываются ), а если без то SQL ругается
Убрал Пул соединений, все зараболтало норм, но тогда корутину нифига не сделать, а раз так то нафиг это надо вообще.
Дойдут руки до фастапи, внительно изучу твой материал, Коль.
Спасибо за твой труд!
Разве в функции get_db , допустим на 5:33 не вылезет ошибка в случае если на 22 строки не удастся создать сессию
Тогда в блоке finally же session не определен
Или как ?
Я изучаю Пайтон на степике, прошел типы данных, циклы, функции, щас множества изучаю , но все это затянулось, а изучать ещё много.Дайте совет пожалуйста.Нужно ли изучать дополнительно для бэкенда более сложные темы , что бы быстрее пройти обучение?или все таки поэтапно лучше ?
нужно.
фастапи вряд ли стоит. Как успехи?
@@David-yj5kv забросил из за работы и ряда других причин
слабенько.@@saidserbiev4628
Для асинхронных фикстур существует декоратор pytest_asyncio в одноименной библиотеке
это уже прошлый век - можно использовать конфиг файл где указать что все по умолчанию асинхронное) в 3м видео я про это рассказываю)
@@luchanos спасибо за информацию)
Подскажите нормальный способ юзать Makefile на винде. Пробовал через WSL Ubundu - не получается запускать из консоли винды Makefile. На форумах говорят что проблема не решаема. Если есть идеи, напишите пожалуйста, буду благодарен!
Через chocolatey
Ребят, подскажите плиз, почему миграции не создаются в папке tests после первого запуска тестов?
Ругается , Directory migrations already exists and is not empty
Та же беда...
Попробуй: from sqlalchemy import text, а потом TRUNCATE заверни в него - await session.execute(text(f'TRUNCATE TABLE {table};'))
Все таки не понятно. Почему yield session а не return. Тогда finally сработает сразу что ли?
Нет, чтобы часть кода запустилась до, а часть после yield. Советую почитать как работают генераторы
Чувак нельзя так переделывать код "за кадром". Огромное спасибо за такой гайд,н о всетаки за кадром такие адовые куски работы оставлять нестоит.
хэш коммита для этого специально пишу и ссылку на репку оставляю, чтобы можно было дифф посмотреть, изивини за неудобства, я пока готовил ролики, там за кадром могло происходить что-то что я мог потерять и поэтому стал крепить хэши
спасибо за добрые слова и поддержку!
Прошу помощи. Не могу понять почему при запуске теста (Pycharm, Win10, Postgres из докера, как в примере) запись нового пользователя происходит в боевую базу "postgres"😑 вместо "postgres_test". Соответственно после теста "assert len(users_from_db) == 1" тест крашается. В тестовой базе тестовый пользак не появляется.
UPDATE. Пытался развернуть клубок, и понял только, что как-то криво работают у меня Depends/Dependency ("app.dependency_overrides[get_db] = _get_test_db"), т.к. при смене базы в самой get_db на TEST_DATABASE_URL - тест срабатывает, и код из теста, кнчн же, пишется в тестовую базу... Подскажите куда дальше копать?
У меня ещё была подобная проблема, но немного не то. Почему то докер композ криво грузил .env. То есть грузил старые переменные окружения. Запустил из под wsl, а там все отлично.
Короче винда докер иногда сбоит
Подскажите, почему у меня тест валится с ошибкой resp = client.post("/user/", data=json.dumps(user_data))
E AttributeError: 'async_generator' object has no attribute 'post'
Вроде всё проверил, всё как в видео
Я оставил хэш коммита под видео, можно попробовать клонировать мой репо и там запустить. И кажется там надо await сделать
@@luchanosтам у меня ваще жесть - все 24 теста валятся. Обидно, ручками писал, а ничего не работает
Ещё есть идеи? Откуда вообще у client берется метод post?
@@user-dg4rg3rk7k та же проблема, как найдете решение пните пожалуйста i.kym-cdn.com/photos/images/newsfeed/001/450/453/464.jpg
@@user-dg4rg3rk7k попробуйте использовать версию pytest-asyncio==0.18.3
Привет, думаю что можно для тестов запатчить так чтобы применились миграции проекта, думал код глянуть и мб мр какой кинуть, но не нашел.... думаю много кому был бы интересен код проекта
Спасибо! Думал что добавил. А теперь и правда добавил в описание) Ссылка на проект - github.com/luchanos/luchanos_oxford_university
Кажется, логичнее models и migrations перенести в db
старая алхимия 🧑💻, DAL это про архитектуру это типо слой, DAO это про имплементацию, поэтому UserDAO
Спасибо! Учту
А как тут комментарии 5 дней назад вышли , если видео вчерашнее ?
это комментарии от подписчиков-спонсоров с бусти уровня Code Reviewer и выше - для них вся отложка открыта. И те, кто покупает отложенный контент разовыми микродонатами)
Зачем создавать отдельный дб сервер для тестов, если можно просто создать дополнительную бд. В алхимии есть возможность создать и удалить все объявленные таблицы, в тестах алембик не нужен, если ты не тестируешь сами миграции
Потому что я привык видеть данные в базе во время тестов
Например, кто-нибудь может перепутать переменную `DB_NAME` и тесты пойдут на продуктовой базе.
И, кстати, потратил 2 дня, чтоб сдружить pytest, alembic, sqlalchemy2, docker. Pасскажите пожалуйста, как обойтись без alembic?
Конкретный вопрос был в автоматическом создании триггеров, которые прописаны в миграциях.
Base.metadata.create_all не справляется.
ПС. Для приложения из видео оно, конечно, бы подощло, но если урок затрагивает более глубокие проблемы - так даже лучше.
@@xewuss3750 чтобы таких ситуаций не происходило на базе обязана стоять защита - read only со всех хостов, которые не в специальном списке. Ещё используют зеркала. Это база)
слушай, про алембик я прям сейчас тебе не отвечу, я сам в нем не сильно опытный, разбираюсь вот. я адепт сырых запросов и мне орм меньше, чем скуэль нравится. уже думал про то, чтобы выпилить всё это дело и перейти на асинкпг))
@@luchanos, с внедрением миграций алембика в тестах вроде разобрался.
А это урок прям для совсем нешарящих людей? Тут дело в архитектуре, dependency injection никакого ты не показал по сути, но если это прям для новичков, то Сойдет