Семен Киреков - Spring Data JPA. Антипаттерны тестирования

Поділитися
Вставка

КОМЕНТАРІ • 15

  • @ranetka8735
    @ranetka8735 2 роки тому +4

    Очень полезный доклад, все по делу и применимо, спасибо!

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

      Спасибо!

  • @avpmk
    @avpmk Рік тому +3

    Используешь рандомайзер в тестах - получаешь тесты, которые рандомно либо проходят либо не проходят. Это тоже антипаттерн.

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

    Спасибо за доклад. Применяю на практике )

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

    Спасибо за доклад.
    Идея с @With отлично подходит для не больших entity(или дто, если более глобально смотреть на тесты), для больших сущность возможно удобнее передавать лямбду, которой менять дефолтные поля, т.к. это избавит от дублирования в тестбилдере большого кол-ва полей, в которых проще допустить ошибку

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

      Спасибо!
      Согласен по поводу больших сущностей. Вообще, мы в новом проекте сейчас пришли к концепции, что entity должна предоставлять статические методы для валидного создания этой самой entity. А AllArgs/NoArgs конструкторы не должны быть доступны из вне. В конце концов, в бизнес-коде не будет тест-билдеров. Так что используя в тестах лишь публичное API класса и скрывая все детали реализации внутри, мы не только конструируем валидные объекты с точки зрения домена, но и сразу тестируем те методы, которые и будут вызываться в коде приложения.

    • @alexandr6055
      @alexandr6055 5 місяців тому

      ​@@kirekov Добрый день. Под стат методами ентити вы имеете ввиду билдер? А конструктор ентити у вас private?

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

    Доклад очень понравился, спасибо. + за интеграционные и End to End тесты.
    Пример с проверкой статуса у робота, где exception прерывает транзакцию. Каждый раз, используя исключения для обработки штатных ситуаций я вижу с проблемы. Если это checked - не откатываются транзакции по умолчанию и нужно постоянно прописывать в сигнатуре по цепочке вызовов. Если unchecked - после рефакторинга может либо не хватить нового catch, либо останется старый мусорный. Я попробовал возвращать объект (статус + доп данные), обрабатывать через if или через switch (статус в enum и это гарантия перебора всех возможных ситуаций в клиентском коде). Это вполне решает задачу. Почему это не используется? Просто не java-style или этому есть еще какие-то причины?

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

      Как я понял, ты говоришь про Either монаду, которая может вернуть либо ошибку, либо исключение. Думаю, проблема в том, что в Java нет (пока еще) прокаченного pattern matching. В Scala Either используется довольно часто, потому что язык позволяет деконструировать ее значение таким образом, что проверка всех возможных вариантов выполняется в compile time. В Java же можно, например, забыть проверить одно из условий и компилятор никак об этом не уведомит. Exception же в этом плане более безопасен. RuntimeException вылетел за границы transactional proxy? Ставим флаг rollback only.

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

      Позволять-то он позволяет, но по умолчанию это warning (unexhaustive match в scala). И проектов, где это не перенастраивали хватает.

  • @bananasba
    @bananasba Рік тому +2

    Замах на рубль, удар на копейку

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

    спасиб

  • @АлександрЗайцев-х3х

    "Ну и это довольно verbose". Тьфу.

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

    В итоге что стоит использовать вместо @DirtyContext? @BeforeEach с repository.deleteAll()?

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

      Лучше явно чистить БД перед тестами. Если использовать Testcontainers, то DirtiesContext вообще никак не поможет, потому что данные будут храниться не в памяти (i.e. в Spring Context), а в контейнере с БД