Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Moscow Python Meetup №97. (MTS Диджитал, Ведущ...

Moscow Python Meetup №97. (MTS Диджитал, Ведущий Python Разработчик). Современный туллинг Python-разработчика для тестирования

Бывает так, что приходишь на проект, а тестов нет. Или тесты плохо работают, или пока ждёшь их завершения — успеваешь выпить чаю и написать ещё одну фичу, которую опять надо тестировать. Каюсь, таким разработчиком был и я. Как-то раз я написал тесты так, что перестал хотеть их запускать через месяц. Я считаю, так быть не должно. Поэтому расскажу, каким требованиям должны отвечать тесты, какие для этого есть инструменты и как повысить тестируемость вашего кода.

Видео: https://moscowpython.ru/meetup/97/modern-testing-tooling/

Moscow Python: http://moscowpython.ru
Курсы Learn Python: http://learn.python.ru
Moscow Python Podcast: http://podcast.python.ru
Заявки на доклады: https://bit.ly/mp-speaker

Moscow Python Meetup

December 24, 2024
Tweet

More Decks by Moscow Python Meetup

Other Decks in Programming

Transcript

  1. Кто я такой? • Работаю в Kion • Python разработчик

    • Оптимизирую сервисы и делаю их надежнее
  2. Кто я такой? • Работаю в Kion • Python разработчик

    • Оптимизирую сервисы и делаю их надежнее • Таксовод
  3. О чём будет доклад • Стабильность тестов • Скорость тестов

    • Убираем бойлерплейт • Генерируем данные
  4. Критерии надежности • Тест выдаёт одинаковый результат при любом количестве

    перезапусков • Тесты проходят и локально, и в ci, и где бы вы их не запустили
  5. Критерии надежности • Тест выдаёт одинаковый результат при любом количестве

    перезапусков • Тесты проходят и локально, и в ci, и где бы вы их не запустили • Можно запустить любое количество тестов и в любом порядке
  6. Критерии надежности • Тест выдаёт одинаковый результат при любом количестве

    перезапусков • Тесты проходят и локально, и в ci, и где бы вы их не запустили • Можно запустить любое количество тестов и в любом порядке • Вы понимаете, зачем этот тест нужен
  7. movie_id = None def test_create_movie() -> None: movie = create_movie()

    try: UUID(movie.id) except ValueError: raise AssertionError('movie id is not UUID') global movie_id movie_id = movie.id def test_load_movie(): movie = load_movie(movie_id) assert movie_id == movie.id
  8. class Movie(BaseModel): title: str = Field(max_length=120) def readable_title(self) -> str:

    return textwrap.wrap(self.title, 30)[0] + '...' def test_movie_title_in_film_page(text_title: str) -> None: movie = Movie(title=text_title) assert movie.title in film_page
  9. Полезные ссылки • Статья от pytest о том, что такое

    flaky tests • GitHub pytest-randomly • Книга Speed Up Your Django Tests
  10. from datetime import datetime def get_greeting() -> str: current_time =

    datetime.now() if current_time.hour < 11: return "Good morning!" if 11 <= current_time.hour < 18: return "Good afternoon!" return "Good evening!"
  11. def test_get_greeting() -> None: greeting = get_greeting() assert greeting in

    ["Good morning!", "Good afternoon!", "Good evening!"]
  12. def test_get_greeting() -> None: greeting = get_greeting() assert greeting in

    ["Good morning!", "Good afternoon!", "Good evening!"]
  13. def test_good_afternoon(freezer) -> None: freezer.move_to("2020-10-17 12:00:00") greeting = get_greeting() assert

    greeting == "Good afternoon!" def test_good_evening(freezer) -> None: freezer.move_to("2020-10-17 19:13:00") greeting = get_greeting() assert greeting == "Good evening!"
  14. Полезные ссылки • Небольшой туториал по freezegun и pytest-freezegun •

    Тесты в проекте tough-dev-school (очень советую)
  15. import pytest @pytest.mark.flaky(retries=3, delay=1) def test_unreliable_service(movie_id: str): assert fetch_movie(movie_id) ==

    Movie( id=movie_id, title='<...>', play_url=f'https://movie.cdn.company.ru/{movie_id} ' )
  16. Полезные ссылки • Довольно полное описание в самом репозитории •

    How-to гайд от pytest о том, как перезапускать только упавшие тесты
  17. Полезные ссылки • Как использовать monkeypatch • Статья о том,

    как использовать pytest-env и его аналоги
  18. Почему тесты тормозят • Долгие действия в тестах • Вы

    красавчик и у вас ОЧЕНЬ много тестов • Долгие действия в приложении
  19. Поиск долгих действий # Profiling test execution duration To get

    a list of the slowest 10 test durations over 1.0s long: `pytest --durations=10 --durations-min=1.0` By default, pytest will not show test durations that are too small (<0.005s) unless -vv is passed on the command-line.
  20. Полезные ссылки • Неплохой туториал по тому, когда и зачем

    использовать timeout для тестов • Ещё один
  21. Полезные ссылки • Известные проблемы в pytest-xdist • Хорошая статья

    для того, чтобы начать использовать pytest- xdist
  22. Полезные ссылки • Разница между юнит тестированием и интеграционным •

    Книга «Принципы юнит-тестирования» Владимир Хориков
  23. Выводы • Не полагайтесь на случайность, контролируйте её! • Изолируйте

    ваши тесты друг от друга и от глобального состояния
  24. Выводы • Не полагайтесь на случайность, контролируйте её! • Изолируйте

    ваши тесты друг от друга и от глобального состояния • Правильно подбирайте инструмент под уровень ваших тестов
  25. Выводы • Не полагайтесь на случайность, контролируйте её! • Изолируйте

    ваши тесты друг от друга и от глобального состояния • Правильно подбирайте инструмент под уровень ваших тестов • Следите за скоростью ваших тестов с самого начала, чтобы потом не было больно
  26. Выводы • Не полагайтесь на случайность, контролируйте её! • Изолируйте

    ваши тесты друг от друга и от глобального состояния • Правильно подбирайте инструмент под уровень ваших тестов • Следите за скоростью ваших тестов с самого начала, чтобы потом не было больно • Пробуйте тестировать не только логику через данные, но и данные через логику!