УРОКИ FASTAPI НА БОЕВОМ СЕРВИСЕ 2. РЕФАКТОРИНГ СТРУКТУРЫ ПРОЕКТА, НАПИСАНИЕ ПЕРВОГО ТЕСТА
В этом ролике отрефакторим структуру нашего проекта, а также заложим инфрастуктурную базу для тестов и напишем первый из них.
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
Пікірлер: 69
Супер. Лайк, подписка🙂
@luchanos
Жыл бұрын
Спасибо, Миша!!
Актуальный хэш коммита - 2e719cacb228d118c78c444caec2d284a22e4e4a ВНИМАНИЕ! Если будете воспроизводить у себя, то обязательно клонируйте мой репозиторий и обратите внимание на файл requirements.txt - там могут быть зависимости, про которые я не упомянул в ролике, нужно будет их поставить через pip install -r requirements.txt
@VladislavSoren
Жыл бұрын
Отличное видео Не забывайте пожалуйста указывать хэш актуального коммита в описании к видео 😄
@user-xi9ww1sg3g
4 ай бұрын
Е
Спасибо за твой труд!
Спасибо за видео👍
АйТиБалабол) продолжение надо) очень классный материал могу в опенсорс писать тесты)
Лучшее что я видел по Fastapi !
Интересно 👍
кайфанул
Дойдут руки до фастапи, внительно изучу твой материал, Коль. Спасибо за твой труд!
Thanks!
Ура!
Ждём ещё видео
класс
В очередной раз актуалочка подъехала
Спасибо за отличный ролик. Скачал код. Но без подсказки в комментах, что надо использовать pytest-asyncio==0.18.3 не мог запустить
Разве в функции get_db , допустим на 5:33 не вылезет ошибка в случае если на 22 строки не удастся создать сессию Тогда в блоке finally же session не определен Или как ?
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 ругается Убрал Пул соединений, все зараболтало норм, но тогда корутину нифига не сделать, а раз так то нафиг это надо вообще.
Подскажите нормальный способ юзать Makefile на винде. Пробовал через WSL Ubundu - не получается запускать из консоли винды Makefile. На форумах говорят что проблема не решаема. Если есть идеи, напишите пожалуйста, буду благодарен!
@user-on9he8to9r
5 ай бұрын
Через chocolatey
Ребят, подскажите плиз, почему миграции не создаются в папке tests после первого запуска тестов? Ругается , Directory migrations already exists and is not empty
@andreymartynov3958
Жыл бұрын
Та же беда...
@pavelkozlov9420
10 ай бұрын
Попробуй: from sqlalchemy import text, а потом TRUNCATE заверни в него - await session.execute(text(f'TRUNCATE TABLE {table};'))
Для асинхронных фикстур существует декоратор pytest_asyncio в одноименной библиотеке
@luchanos
Жыл бұрын
это уже прошлый век - можно использовать конфиг файл где указать что все по умолчанию асинхронное) в 3м видео я про это рассказываю)
@user-dk3sx6xk2u
Жыл бұрын
@@luchanos спасибо за информацию)
Я изучаю Пайтон на степике, прошел типы данных, циклы, функции, щас множества изучаю , но все это затянулось, а изучать ещё много.Дайте совет пожалуйста.Нужно ли изучать дополнительно для бэкенда более сложные темы , что бы быстрее пройти обучение?или все таки поэтапно лучше ?
@vk2591
Жыл бұрын
нужно.
@David-yj5kv
Жыл бұрын
фастапи вряд ли стоит. Как успехи?
@saidserbiev4628
Жыл бұрын
@@David-yj5kv забросил из за работы и ряда других причин
@ruslankrabov6283
10 ай бұрын
слабенько.@@saidserbiev4628
Чувак нельзя так переделывать код "за кадром". Огромное спасибо за такой гайд,н о всетаки за кадром такие адовые куски работы оставлять нестоит.
@luchanos
2 ай бұрын
хэш коммита для этого специально пишу и ссылку на репку оставляю, чтобы можно было дифф посмотреть, изивини за неудобства, я пока готовил ролики, там за кадром могло происходить что-то что я мог потерять и поэтому стал крепить хэши спасибо за добрые слова и поддержку!
Для синхронизации тестовой бд с реальной можно использовать такую фикстуру @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) И не надо будет запариваться с миграциями алембика и создавать папку с ними.
Прошу помощи. Не могу понять почему при запуске теста (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 - тест срабатывает, и код из теста, кнчн же, пишется в тестовую базу... Подскажите куда дальше копать?
@dmitry-lz1ny
2 ай бұрын
У меня ещё была подобная проблема, но немного не то. Почему то докер композ криво грузил .env. То есть грузил старые переменные окружения. Запустил из под wsl, а там все отлично. Короче винда докер иногда сбоит
Кажется, логичнее models и migrations перенести в db
Все таки не понятно. Почему yield session а не return. Тогда finally сработает сразу что ли?
@luchanos
Жыл бұрын
Нет, чтобы часть кода запустилась до, а часть после yield. Советую почитать как работают генераторы
Подскажите, почему у меня тест валится с ошибкой resp = client.post("/user/", data=json.dumps(user_data)) E AttributeError: 'async_generator' object has no attribute 'post' Вроде всё проверил, всё как в видео
@luchanos
Жыл бұрын
Я оставил хэш коммита под видео, можно попробовать клонировать мой репо и там запустить. И кажется там надо await сделать
@user-dg4rg3rk7k
Жыл бұрын
@@luchanosтам у меня ваще жесть - все 24 теста валятся. Обидно, ручками писал, а ничего не работает
@user-dg4rg3rk7k
Жыл бұрын
Ещё есть идеи? Откуда вообще у client берется метод post?
@aliaskarisakov1147
Жыл бұрын
@@user-dg4rg3rk7k та же проблема, как найдете решение пните пожалуйста i.kym-cdn.com/photos/images/newsfeed/001/450/453/464.jpg
@aliaskarisakov1147
Жыл бұрын
@@user-dg4rg3rk7k попробуйте использовать версию pytest-asyncio==0.18.3
Привет, думаю что можно для тестов запатчить так чтобы применились миграции проекта, думал код глянуть и мб мр какой кинуть, но не нашел.... думаю много кому был бы интересен код проекта
@luchanos
Жыл бұрын
Спасибо! Думал что добавил. А теперь и правда добавил в описание) Ссылка на проект - github.com/luchanos/luchanos_oxford_university
старая алхимия 🧑💻, DAL это про архитектуру это типо слой, DAO это про имплементацию, поэтому UserDAO
@luchanos
Жыл бұрын
Спасибо! Учту
А как тут комментарии 5 дней назад вышли , если видео вчерашнее ?
@luchanos
Жыл бұрын
это комментарии от подписчиков-спонсоров с бусти уровня Code Reviewer и выше - для них вся отложка открыта. И те, кто покупает отложенный контент разовыми микродонатами)
Зачем создавать отдельный дб сервер для тестов, если можно просто создать дополнительную бд. В алхимии есть возможность создать и удалить все объявленные таблицы, в тестах алембик не нужен, если ты не тестируешь сами миграции
@luchanos
Жыл бұрын
Потому что я привык видеть данные в базе во время тестов
@xewuss3750
Жыл бұрын
Например, кто-нибудь может перепутать переменную `DB_NAME` и тесты пойдут на продуктовой базе. И, кстати, потратил 2 дня, чтоб сдружить pytest, alembic, sqlalchemy2, docker. Pасскажите пожалуйста, как обойтись без alembic? Конкретный вопрос был в автоматическом создании триггеров, которые прописаны в миграциях. Base.metadata.create_all не справляется. ПС. Для приложения из видео оно, конечно, бы подощло, но если урок затрагивает более глубокие проблемы - так даже лучше.
@luchanos
Жыл бұрын
@@xewuss3750 чтобы таких ситуаций не происходило на базе обязана стоять защита - read only со всех хостов, которые не в специальном списке. Ещё используют зеркала. Это база) слушай, про алембик я прям сейчас тебе не отвечу, я сам в нем не сильно опытный, разбираюсь вот. я адепт сырых запросов и мне орм меньше, чем скуэль нравится. уже думал про то, чтобы выпилить всё это дело и перейти на асинкпг))
@xewuss3750
Жыл бұрын
@@luchanos, с внедрением миграций алембика в тестах вроде разобрался.
А это урок прям для совсем нешарящих людей? Тут дело в архитектуре, dependency injection никакого ты не показал по сути, но если это прям для новичков, то Сойдет