Навигация по курсу:
Немного о печальном
Я делал этот пост, и он был завершен на 90%, а затем я по ошибке закрыл вкладку и потерял свою работу 😭 На этот раз я использую расширение, которое автоматически сохраняет и тем самым спасает меня!
Итак, сегодня нам предстоит обсудить модульное тестирование. Многие из вас могут подумать, что именно поэтому я не написал тест перед тем, как создать маршрут создания пользователя. Это потому, что я видел, как мои коллеги боролись с TDD и, наконец, теряли интерес. Вместо этого я хочу развить у вас интерес к развитию. Если вы заинтересованы, мы сами будем следовать лучшим практикам.
Для тех, кто не знает, что такое TDD:
Важен ли TDD? Недолго думая, я бы сказал да . В кодовой базе нашей компании около 1400+ модульных тестов. Всего два года назад мы буквально боялись каждый раз, когда нам приходилось выпускать новую функцию. Потому что если я внесу одно-единственное изменение в таблицу «users», я не знаю, какая часть нашей кодовой базы может сломаться! Я использую модульные тесты в основном для одной цели. Для меня они работают как документация. Разрабатывая модульный тест, я рассказываю коллегам-разработчикам, как именно должна работать эта новая функция. (Именование теста играет здесь самую важную роль!)
Ладно, хватит разговоров, я не хочу утомлять вас бесполезным трепом. Итак, давайте перейдем к делу. Нам нужно создать несколько файлов и папок:
Нам также понадобится pytest и запросы для тестирования наших API. Итак, давайте изменим наш файл requirements.txt и выполним команду
pip install -r requirements.txt
чтобы установить их.
Теперь добавим конфигурации для тестирования. Вставьте следующие строки в tests > conftest.py (разбил на 2 фотки, тк много кода). Не ленитесь перепечатывать, это очень полезно, тк вы точно запомните материал (это реально так работает)
- Ого, это слишком большая пытка. Но если вы прочитаете этот файл, вы поймете 90% вещей. Попробуйте.
- Мы создаем новый экземпляр Fastapi, приложение и новую базу данных. Это база данных SQLite, и нам не нужно ничего делать, потому что Python создаст файл — test_db.db.
- Мы делаем это, потому что не хотим испортить нашу исходную базу данных тестовыми данными. Только представьте себе сотни и тысячи писем типа «test@nofoobar.com»!
- Теперь большой вопрос: будет ли Fastapi использовать эту тестовую базу данных, и если да, то как? Помните концепцию зависимостей, которую мы изучали в предыдущем посте. Хорошо, что мы не запрограммировали базу данных, которая будет использоваться в маршрутах, жестко. Мы используем зависимость с именем get_db для обеспечения сеанса базы данных.
- В наших модульных тестах мы будем переопределять эту зависимость и предоставлять вместо нее нашу тестовую базу данных. Эта концепция известна как внедрение зависимостей.
- Существует правило, что каждый тест должен быть независимым. Итак, мы сбрасываем/откатываем изменения в таблицах БД и даже создаем новую базу данных для каждого теста! Кстати, отката будет достаточно 😅
Теперь мы можем создавать модульные тесты. Обратите внимание, что мы сделали «клиент» тестовым приспособлением на уровне модуля. Таким образом, используя этот клиент, мы сможем откатить ситуацию и сохранить наши тесты изолированными и независимыми. Введите приведенный ниже код в tests > test_routes > test_users.py
Готово, теперь введите в терминале
pytest
и увидите волшебство!
Еще один модульный тест
Давайте напишем еще один модульный тест, чтобы лучше познакомиться с модульным тестированием. В идеале мы должны иметь 100% покрытие и протестировать каждый из наших маршрутов. Однако модульные тесты просто следуют шаблону. Если вы понимаете этот шаблон, вы можете самостоятельно написать модульный тест для всех маршрутов.
На этот раз давайте займемся маршрутом get_blog . Чтобы протестировать получение блога, мы должны сначала создать блог, и только тогда мы сможем получить его. Однако, чтобы создать блог, нам нужно создать пользователя🤦!
Поскольку транзакции откатываются и даже база данных усекается при каждом модульном тесте. Все наши модульные тесты независимы друг от друга. Пользователь, которого мы создали в нашем последнем уроке для модульного теста маршрута create_user, больше не существует. Давайте напишем несколько служебных функций для создания случайного пользователя и случайного блога.
В файле с именем test > utils > user.py нам нужно поместить логику для создания нового случайного пользователя. Мы можем использовать репозиторий для создания нового пользователя.
Эта функция отвечает за создание нового пользователя и его возврат. Мы можем использовать этот метод для создания нового случайного блога в tests > utils > blog.py
Теперь мы готовы создать тест, который извлекает блог из маршрута get_blog()
Теперь, если вы введете pytest, вы должны увидеть прохождение 2 тестов.
Если вы хотите отладить тест, вы можете добавить несколько операторов печати и ввести pytest -s , это позволит pytest узнать, что он должен быть подробным, и отобразить вывод операторов печати на стандартный вывод.
✅ В следующей статье будем делать наш код чище и более читабельным.
Читайте также: Часть 12 (Очистка кодовой базы)
.
❤️ Если вам понравилась статья, ставьте лайк и подписывайтесь на мой канал (Заходи в Ай-Ти).
👍 Если у вас остались вопросы или есть интересные темы, которые вы хотите, чтобы я разобрал, то пишите в комментариях. Ваше мнение очень важно для меня!
#fastapi #fastapi python #fastapi sqlalchemy #fastapi pydantic #unit test #юнит тесты питон