Юнит-тестирование. Использование unittest и coverage в PyCharm

Поділитися
Вставка
  • Опубліковано 18 лис 2024

КОМЕНТАРІ • 120

  • @PythonRussian
    @PythonRussian  3 роки тому +117

    интересно продолжение темы юнитов?

    • @ИванБалалайка-г5е
      @ИванБалалайка-г5е 3 роки тому +3

      Отличное видео. Пересмотрел штук 10 видео по unittest-ам, но только это видео сформировало полную картину происходящего. Спасибо, жду продолжение с нетерпением)

    • @PythonRussian
      @PythonRussian  3 роки тому +7

      @@ИванБалалайка-г5е сделаю в ближайшее время

    • @exe88cution
      @exe88cution 3 роки тому +1

      Естественно! Очень классно всё рассказано, не первое Ваше видео смотрю, единственное что, немного погромче бы)

    • @PythonRussian
      @PythonRussian  3 роки тому +8

      @@exe88cution да со звуком чего нибудь подумаю. По тестам будет продолжение -углубление по юниттесту и посмотрим на питест.

    • @edgull_tlt
      @edgull_tlt 3 роки тому +3

      Конечно!

  • @petrovsky1982
    @petrovsky1982 Рік тому +7

    Отличный урок! Понравилось то, что автор не лезет в охват всего и вся. Чётко показывает: что и как работает, как соединяются тесты и сама программа. В общем лайк. Мне unittest как раз понравился тем, что он встроенный в Python. Спасибо! Пожалуйста продолжайте!

  • @pavloOps
    @pavloOps 11 місяців тому

    Специально вернулась, чтобы оставить коммент и выразить ОГРОМНУЮ благодарность за видео! Делаю сейчас свой дипломный проект, и ваше видео очень помогло с написанием юнит-тестов для БЕРТ-модели. Спасибо от всей души! Сделала подробный конспект, чтобы всегда был под рукой 🤗🤗🤗🥰🥰🥰

    • @PythonRussian
      @PythonRussian  11 місяців тому

      рад что помог, хотя и не знаю что за берт-модель

    • @pavloOps
      @pavloOps 11 місяців тому +1

      @@PythonRussian это нейронка, которая в моем случае делает классификацию позитивных и негативных текстовых сообщений. На нее тесты непростые, и ваша схема оформления оказалась для меня просто идеальной ❤️

  • @alley1180
    @alley1180 3 роки тому +6

    Супер! Спасибо. Хочется продолжения темы. У вас талант, объясняете очень доходчево.

  • @АркадийСергеев-о8м

    Спасибо, за видео. Все никак руки не доходили до тестов. Все понятно и по делу.

  • @РоманГончар-г9б
    @РоманГончар-г9б 10 місяців тому

    Для меня, как для начинающего программиста языка Python все очень даже понятно и интересно! спасибо тебе за урок

  • @dmitrii_kotoff
    @dmitrii_kotoff 7 місяців тому +1

    Если у кого не работает юниттесты по примеру автора (как не работало и у меня), то можно поробовать так:
    1. добавляем Unittests -> Custom
    2. в окошке Additionfl Arguments добавить: discover -s tests -p '*_test.py'
    3. в окошке Working directory выбрать папку в которой лежат и тестируемый модуль и папка с тестами. Т.е. папка, которая на уровень выше, чем модуль и папка с тестами.
    За урок спасибо, все норм!

  • @abra-kadabra5000
    @abra-kadabra5000 11 місяців тому +1

    Огромное спасибо! Очень круто и доходчиво все объяснено!

  • @Ordinary_man2049
    @Ordinary_man2049 Рік тому +1

    Спасибо большое. Смотрю уроки с огромным интересом!

  • @Trezvy_Papa
    @Trezvy_Papa 8 місяців тому

    Всё. Перехожу с асертов на юниты. Прям огромное желание появилось юнит тесты писать. Благодарю

    • @PythonRussian
      @PythonRussian  8 місяців тому +1

      на самом деле это очень полезное желание, я сейчас без этого просто проект никакой не начинаю, потому что его просто потом сложно поддерживать, менять, рефакторить. Нет уверенности после правок, а с тестами, если не лениться и набраться опыта есть уверенность в том, что все сделано верно.

    • @Trezvy_Papa
      @Trezvy_Papa 8 місяців тому +1

      ​@@PythonRussianнаписал несколько. Глаз радуется этим зелёным галочкам. Рад, как ребенок, что у меня теперь будут нормальные тесты. Осталось coverage подключить.

  • @bro_webman
    @bro_webman Рік тому +1

    Спасибо за контент, нашёл просто кучу ответов на свои вопросы, с которыми столкнулся в процессе погружения в питон. Особенная благодарность за тесты и гит, наглядно и доступно. Успехов в развитии и большая просьба не останавливаться у вас очень хорошо получается!)

  • @umni_kot
    @umni_kot Рік тому +1

    Крутой контент, спасибо. И чувствуется бест практис в подаче материала. Класс.

  • @foxywrthstupid
    @foxywrthstupid 2 роки тому +1

    Ты просто супер! Всё доходчиво и понятно! Спасибо тебе.

  • @Kostya_kzn
    @Kostya_kzn 3 роки тому +11

    Очень нужное и полезное видео👏

  • @user-lechat-lexus
    @user-lechat-lexus 3 роки тому +2

    Шикарная подача материала, спасибо! Очень хотелось бы видео про Mock

    • @PythonRussian
      @PythonRussian  2 роки тому

      будет, но по срокам не скажу, как со временем станет посвободнее

    • @user-lechat-lexus
      @user-lechat-lexus 2 роки тому

      @@PythonRussian ждём 👍

  • @lukasmog777
    @lukasmog777 Рік тому +1

    Спасибо за видео!
    Написал тестовое на вакансию по твоему видео))

  • @ЕвгенийЧервинский-с7х

    Отличное видео! Сразу можно использовать в работе. Спасибо

    • @PythonRussian
      @PythonRussian  3 роки тому +1

      спасибо, по юнитам планирую еще несколько видео снять

  • @viktorsokolov8153
    @viktorsokolov8153 2 роки тому

    Спасибо за полезное видео. Интересное введение в тестирование. Спасибо за альтернативу if

  • @Константин-е5л7ь
    @Константин-е5л7ь 2 роки тому

    Спасибо огромное! Все по делу все понятно. Вполне воспроимчиво и на скорости 2х

  • @Brailko_Oleh
    @Brailko_Oleh 2 роки тому

    Супер, спасибо. Хочется продолжения этой темы

  • @alexeykolodochkin5826
    @alexeykolodochkin5826 3 роки тому +1

    За словарь отдельный респект.

  • @eugene_mountainland
    @eugene_mountainland Рік тому

    Спасибо огромное!
    Очень разжевал)

  • @riblodka
    @riblodka 3 роки тому +3

    Очень жду видео о Mock

    • @PythonRussian
      @PythonRussian  3 роки тому +1

      будет, но позже, эта тема уже в списке.

  • @im0767
    @im0767 Рік тому

    Большое спасибо! Понятно и интересно.

  • @cOnT3ST
    @cOnT3ST Рік тому

    Наглядно. От начала и до конца

  • @РусРус-и9п
    @РусРус-и9п 3 роки тому

    Ох, спасибо! Особенно за настройку пайчарма ) кстати, в ТЗ не сказано, что числа должны быть положительными )

    • @PythonRussian
      @PythonRussian  3 роки тому +2

      я спросил у автора тз, то есть у себя - должны быть положительными =)

  • @Ananacuk777
    @Ananacuk777 2 роки тому

    Пока учишься главное не забывать привыкать комитить)

  • @y18kotov
    @y18kotov 2 роки тому +1

    Чудесно. Спасибо

  • @jokobaka8669
    @jokobaka8669 2 роки тому

    Блин, я бы никогда не додумался так написать калькулятор (это комплимент).

  • @НикитаМельнов-ш5ы

    Очень полезное видео

  • @Ксандр-л1щ
    @Ксандр-л1щ 5 місяців тому

    великолепно!

  • @paulkarkarin466
    @paulkarkarin466 2 роки тому +2

    18:00 почему на ноль не попробовал поделить? Страшно стало?)

  • @МаксимЛапин-ж8о
    @МаксимЛапин-ж8о 3 роки тому

    Очень круто и понятно +100500👍. Спасибо

  • @Прогулкивокругсвета-ф2ю

    На 16:51 ведь TypeError не может упасть, так как мы изначально преобразовываем в int и даже если там строка будет с буквами или с float то будет падать ValueError? Или есть ещё случаи когда может упасть TypeError в этом случае?

  • @edgull_tlt
    @edgull_tlt 3 роки тому +1

    Спасибище!!!

  • @exe88cution
    @exe88cution 3 роки тому +1

    Очень хотелось бы посмотреть видео про рефакторинг кода. Где бы рассказывалось про запахи кода, хорошего тона и как лучше где что делать) Невероятно востребованная и "хайповая" тема, которая неприменно зайдёт для всех) Надеюсь прислушаетесь.

    • @PythonRussian
      @PythonRussian  3 роки тому

      сделаем, но чуть позже

  • @igorxjarvinen
    @igorxjarvinen Рік тому

    17:30 калькулятор работает только с положительными числами, ввод -2-3 выдаст ошибку вместо -5.
    26:07 тест деления не проверяет, что в ответе float. self.assertEqual(calculator('10/5'), 2) выдаст ОК, когда должно быть 2.0
    решение первой проблемы - переделывать калькулятор, а как решить вторую?

  • @volodymyr8215
    @volodymyr8215 2 роки тому +1

    доступно. Дякую)

  • @МарияКожевникова-ц3з
    @МарияКожевникова-ц3з 10 місяців тому

    Спасибо огромное, очень понятное и полезное видео, но деление на ноль не протестировано - это из самого очевидного

    • @МарияКожевникова-ц3з
      @МарияКожевникова-ц3з 10 місяців тому

      def calculator(expression):
      allowed = '/*+-'
      if not any(sign in expression for sign in allowed):
      raise ValueError(f'Выражение должно содержать хотя бы один знак({allowed})')
      for sign in allowed:
      if sign in expression:
      try:
      left, right = expression.split(sign)
      left, right = int(left), int(right)
      return {
      '+': lambda x, y: x + y,
      '-': lambda x, y: x - y,
      '*': lambda x, y: x * y,
      '/': lambda x, y: x / y
      }[sign](left, right)
      except(ValueError, TypeError):
      raise ValueError(f'Выражение должно содержать два целых числа и только один знаки вида: ({allowed})')
      except(ZeroDivisionError):
      print("Что-то пошло не так...")

    • @МарияКожевникова-ц3з
      @МарияКожевникова-ц3з 10 місяців тому

      но как проверить эту ошибку в юнит тесте?

  • @yakovlichevau
    @yakovlichevau 3 роки тому +1

    А какие книги по тестированию Вы можете порекомендовать новичку? С каких книг начать? (Видео очень крутое и полезное. Большое спасибо! 👍)

    • @PythonRussian
      @PythonRussian  3 роки тому +3

      для питона могу вспомнить Барйана Оккена и его книгу о питесте. Я же по факту из джавы пришел и все теорию освоил еще там, потому рекомендую те книги и читать, пусть там примеры и на джаве. "Test Patterns Refactoring Test Code" by Gerard Meszaros - это отец терминов фейк, мок, дамми, стаб, рекомендую. "Разработка через тестирование" Кента Бека - это отец нЮнит фреймворков и ТДД. "Refactoring: Improving the Design of Existing Code" by Martin Fowler - Мартин просто красавчик, в этой книге много полезного по рефакторингу, чистому коду и тестам. Можно даже начать с последней. Есть еще "Test-Driven Python Development" от какого-то индуса, но чего то не запомнилось мне, не могу сказать хорошая ли.

    • @yakovlichevau
      @yakovlichevau 3 роки тому

      @@PythonRussian спасибо! 🤝

  • @jamjam3337
    @jamjam3337 Рік тому

    👍👏

  • @TORT777
    @TORT777 2 роки тому

    кнопка чтобы посмотреть Coverege не активна . как ее активировать ?

    • @PythonRussian
      @PythonRussian  2 роки тому +1

      кажется в видео говорил (но мог забыть) - активна в полной версии пичарма. Без нее можно установить coverage и через терминал запускать, но уже не так удобно

  • @TheRadiant78
    @TheRadiant78 3 роки тому +1

    Извините за вопрос новичка..А что происходит с тестами когда программа собирается API?? Их убирают ,или они остаются в общем пакете??

    • @PythonRussian
      @PythonRussian  3 роки тому

      не понял что значит программа собирается апи, но тесты остаются всегда в проекте, их заливают в общий репозиторий как раз для того чтобы любой разработчик мог их прогнать. Более того, при сборке продукта или добавлении любого изменения тоже автоматически прогоняются тесты - чтобы убедиться, что все в норме. Тебе дают задачу написать какую то новую фичу -ты пишешь ее, прогоняешь тесты (что ничего не сломал) и еще добавляешь тесты на то, что написал. Все это идет в продукт, код+тесты для него.

    • @TheRadiant78
      @TheRadiant78 3 роки тому +1

      @@PythonRussian спасибо за ответ, именно это я и хотел узнать..Я учусь писать на питоне приложения для смартфонов с помощью KivyMD, они после сборки много весят,плюс тесты, вообщем начинаю думать, что питон пока не лучшее решение для написание приложений)) Огромное вам спасибо, ваши видео очень полезные и лёгкие для восприятия!

    • @PythonRussian
      @PythonRussian  3 роки тому +1

      @@TheRadiant78 я бы посоветовал для мобилок выбрать джаву/котлин, это их территория

  • @andrewpuchinin8547
    @andrewpuchinin8547 Рік тому

    К великому сожалению кнопка coverage активна лишь в платно Пучаре (ну или я просто не доразобрался в настроках, но мало вероятно). А как было бы круто - запустил - и сразу видишь, где не покрыто...))

    • @PythonRussian
      @PythonRussian  Рік тому

      coverage это модуль в питоне, если кнопки нет, то его можно просто установить и запустить руками

  • @chamavn
    @chamavn 3 роки тому

    Спасибо!

  • @ri6ik
    @ri6ik 2 роки тому

    Класс

  • @Igor245390
    @Igor245390 Рік тому

    unittest.mock Objects что такое и зачем нужно?

    • @PythonRussian
      @PythonRussian  Рік тому

      в документации есть ответ, видео про мок будет явно не скоро

  • @Константин-ш9и5э
    @Константин-ш9и5э 2 роки тому

    понимаю, что видео не к этому, но очень ждал деление на 0 в тест кейсах

    • @PythonRussian
      @PythonRussian  2 роки тому

      тут видишь в чем дело - сам код никак такое поведение не отрабатывал. То есть если мы такой тест добавим то что проверим? Что питон кидает исключение при делении на 0? так это в тестах самого питона проверено. Что наш код такое не обрабатывает?

  • @AMARO33
    @AMARO33 3 роки тому +2

    Сорри за оффтоп. Какая это тема в PyCharm?

    • @PythonRussian
      @PythonRussian  3 роки тому +1

      посмотри в плагинах, Dark purple theme вроде называется, по слову purple легко найти, плагин устанавливаешь и можно тему выбрать. Мне дюже по нраву пришлась

    • @AMARO33
      @AMARO33 3 роки тому +1

      @@PythonRussian спасибо

  • @БогданАтрошенко-в9у

    глянул в community edition нет coverege грусть

    • @PythonRussian
      @PythonRussian  Рік тому

      coverage можно установить через пип и использовать в терминале, правда конечно уже не так показательно.

  • @dimabaranov8167
    @dimabaranov8167 Рік тому

    Можно пожалуйста ссылку на видео про ассерты, если оно осталось

    • @PythonRussian
      @PythonRussian  Рік тому

      что значит "если осталось"? мы бережем все для вас! ua-cam.com/video/Z3UmS3YlODk/v-deo.html

    • @dimabaranov8167
      @dimabaranov8167 Рік тому

      @@PythonRussian спасибо

  • @yakovlichevau
    @yakovlichevau 3 роки тому

    А есть ли возможность самому задать порядок выполнения тестовых методов? Как я понял, они выполняются в алфавитном порядке, то есть, например в таком:
    test_attack
    test_end_move
    test_go
    test_begin_move
    Но мне для тестирования важен порядок выполнения тестов, то есть например, такой:
    test_begin_move
    test_go
    test_attack
    test_end_move
    Не хотелось бы все методы (begin_move, go, attack, end_move) располагать в одном тестирующем методе, поэтому возник вопрос, возможно ли задать порядок, в котором выполняются тестовые методы?

    • @PythonRussian
      @PythonRussian  3 роки тому +1

      обычно это означает что ты что-то делаешь не так, тесты должны быть независимы друг от друга. Если тебе для теста какой то функции нужно, чтобы система была в каком то состоянии (например сделан ход), то конкретно для этого теста можешь сделать сет_ап, подготовку такой ситуации. Но привязывать тесты к друг другу обычно плохая практика. Можно подумать о разюивке на классы, где в 1 классе те, что не требуют подготовки, в другом с подготовкой и т.д.

  • @ЭтоМедуза
    @ЭтоМедуза 2 місяці тому

    32:50
    А у меня вообще весь пайчарм тестируется. Вместо 1 теста запускаются 500+. Хотя у меня всего пара тестов создано

  • @Phenosss
    @Phenosss 3 роки тому +1

    Привет! Когда ждать selenium+pytest+page object? (:

    • @PythonRussian
      @PythonRussian  3 роки тому +2

      возможно в этом году, я как раз хотел тему парсинга немного затронуть, рассказать про селениум как его правильно настроить и установить. А вот пейдж-обджект немного сложнее в том плане что я пока вообще не затрагивал в видео паттерны и ООП, какой то резкий скачок получится. Но попробовать можно, записал в планы.

  • @МихаилХолостов-р1п

    на 16:43 исключение не сработает. int обработает что-то типа 5.84 и не подавится

    • @PythonRussian
      @PythonRussian  Рік тому +1

      люблю я знатоков из ютуба. А ты попробуй-ка в консоли написать int('5.84') ведь у нас там строка.

    • @МихаилХолостов-р1п
      @МихаилХолостов-р1п Рік тому

      @@PythonRussian а ну да, я пробовал float передать

  • @МаксимМаксимов-ч9т
    @МаксимМаксимов-ч9т 2 роки тому +1

    Eval?)

    • @tot_samiyenot8732
      @tot_samiyenot8732 2 роки тому

      Но нужно быть осторожным. Она попробует исполнить все что ей передадут

  • @mlr__roal_6867
    @mlr__roal_6867 Рік тому

    Я и без всяких тестов всегда жопой чувствую работает мой код или нет. Правда, пишу только для себя.

  • @alexeykolodochkin5826
    @alexeykolodochkin5826 3 роки тому

    Просьба: Если можно, продолжить тему тестирования. Заранее спасибо.

    • @PythonRussian
      @PythonRussian  3 роки тому

      да, все будет, несколько роликов в планах, просто пока нет времени, сделаю

  • @sergeytomilin5134
    @sergeytomilin5134 4 місяці тому

    Начало практики 8:38

  • @izzzanaaami
    @izzzanaaami 2 роки тому +1

    А могли бы вы сделать шрифт еще меньше, чтобы глаза вытекли?

    • @PythonRussian
      @PythonRussian  2 роки тому +1

      а вы могли бы смотреть на нормальном мониторе? не на телефоне

    • @izzzanaaami
      @izzzanaaami 2 роки тому

      @@PythonRussian mac 13 inch кровь из глаз

    • @PythonRussian
      @PythonRussian  2 роки тому +2

      @@izzzanaaami у тебя тогда проблема со зрением, у меня тоже макбук эйр 13 дюймов, делаю полный экран и все прекрасно вижу

  • @freelife1000
    @freelife1000 2 роки тому

    11. 03

  • @azheval
    @azheval 3 роки тому +1

    Код очень мелкий. На всех ваших видео. Постоянное всматривание не способствует процессу обучения.

    • @PythonRussian
      @PythonRussian  3 роки тому +1

      ну у меня даже на 13 дюймовов ноуте все нормально видно, не говоря о мониторе компа. Стараюсь и так увеличивать.

  • @DagvelloUkr
    @DagvelloUkr Рік тому

    Для ленивых
    def calculator(expression):
    """Функция калькулятор"""
    allowed = '+-*/'
    if not any(sign in expression for sign in allowed):
    raise ValueError(f'Выражение должно содержать хотя бы один знак ({allowed})')
    for sign in allowed:
    if sign in expression:
    try:
    left, right = expression.split(sign)
    left, right = int(left), int(right)
    return {
    '+': lambda a, b: a + b,
    '-': lambda a, b: a - b,
    '*': lambda a, b: a * b,
    '/': lambda a, b: a / b,
    }[sign](left, right)
    except (ValueError, TypeError):
    raise ValueError('Выражение должно содержать 2 целых числа и один знак')
    if __name__ == '__main__':
    print(calculator('10/5'))
    -------------------------------------------------------------------
    from unittest import TestCase, main
    from calculator import calculator
    class CalculatorTest(TestCase):
    """Тесты для функции calculator"""
    def test_plus(self):
    """Тест функции плюс"""
    self.assertEqual(calculator('2+2'), 4)
    def test_minus(self):
    """Тест функции минус"""
    self.assertEqual(calculator('5-3'), 2)
    def test_multi(self):
    """Тест функции умножения"""
    self.assertEqual(calculator('5*3'), 15)
    def test_divide(self):
    """Тест функции деления"""
    self.assertEqual(calculator('10/5'), 2.0)
    if __name__ == '__main__':
    main()

  • @КлаусШтертебекер-ю1щ

    Почему-то при попытке запустить кейс вот такая ошибка валится, уже второй час не могу разобраться помогите плз:
    "C:\Program Files (x86)\Python\python.exe" "C:\Program Files\JetBrains\PyCharm Community Edition 2021.2\plugins\python-ce\helpers\pycharm\_jb_pytest_runner.py" --target test_summary_func.py::TestSumm
    Testing started at 2:00 ...
    Launching pytest with arguments test_summary_func.py::TestSumm in C:\Users\it2g\PycharmProjects\probe
    INTERNALERROR> Traceback (most recent call last):
    INTERNALERROR> File "C:\Users\it2g\AppData\Roaming\Python\Python39\site-packages\_pytest\main.py", line 90, in wrap_session
    INTERNALERROR> config._do_configure()
    INTERNALERROR> File "C:\Users\it2g\AppData\Roaming\Python\Python39\site-packages\_pytest\config.py", line 839, in _do_configure
    INTERNALERROR> self.hook.pytest_configure.call_historic(kwargs=dict(config=self))
    INTERNALERROR> File "C:\Users\it2g\AppData\Roaming\Python\Python39\site-packages\_pytest\vendored_packages\pluggy.py", line 729, in call_historic
    INTERNALERROR> self._hookexec(self, self._nonwrappers + self._wrappers, kwargs)
    INTERNALERROR> File "C:\Users\it2g\AppData\Roaming\Python\Python39\site-packages\_pytest\vendored_packages\pluggy.py", line 338, in _hookexec
    INTERNALERROR> return self._inner_hookexec(hook, methods, kwargs)
    INTERNALERROR> File "C:\Users\it2g\AppData\Roaming\Python\Python39\site-packages\_pytest\vendored_packages\pluggy.py", line 333, in
    INTERNALERROR> _MultiCall(methods, kwargs, hook.spec_opts).execute()
    INTERNALERROR> File "C:\Users\it2g\AppData\Roaming\Python\Python39\site-packages\_pytest\vendored_packages\pluggy.py", line 596, in execute
    INTERNALERROR> res = hook_impl.function(*args)
    INTERNALERROR> File "C:\Users\it2g\AppData\Roaming\Python\Python39\site-packages\_pytest\assertion\__init__.py", line 70, in pytest_configure
    INTERNALERROR> warn_about_missing_assertion(mode)
    INTERNALERROR> File "C:\Users\it2g\AppData\Roaming\Python\Python39\site-packages\_pytest\assertion\__init__.py", line 159, in warn_about_missing_assertion
    INTERNALERROR> assert False
    INTERNALERROR> AssertionError
    Process finished with exit code 3
    Empty suite
    Empty suite
    Что можно сделать?

    • @PythonRussian
      @PythonRussian  3 роки тому

      У тебя точно питест должен быть? В ошибке видно, что тестов нет(empty suit), проверь что они есть и называются в стиле test_something

  • @СергейПопадев
    @СергейПопадев 4 місяці тому

    Слишком много воды в начале видео