Рубрики
Без рубрики

Совершенствование Процесса Персонального Программирования С Помощью Сенсея

Используя простой пример JUnit 5 с соглашением о постоянном именовании вместо аннотаций. Правило сопоставления имени метода и правило перезаписи метода и аннотаций. Также рассмотрите выполнение этого в обратном порядке. Помеченный java, junit, junit 5.

Добавление аннотаций и Переименование методов

Для этого поста я воссоздал “плохой” подход к кодированию, который я использовал, когда изучал JUnit, и продемонстрирую, как преобразовать “плохой” шаблон в согласованный и “лучший” шаблон кодирования с помощью Sensei.

Когда я изучал JUnit, я мог держать в голове только так много за один раз. Я постоянно забывал, как пропускать тесты, когда они не работали.

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

Мы также можем дополнить наш процесс инструментами, и инструменты подскажут нам, как поступить правильно. Thoughtworks описывает это как “инструменты над правилами” в своем Списке радаров технологий для Сенсея :

“облегчите выполнение правильных действий, применяя правила и процедуры управления, подобные контрольным спискам”

Отключение теста JUnit

В идеале я бы, как мы все знаем, использовал аннотацию @Disabled и написал:

~~~~ @~~~~ @~~~~ @~~~~ @ Отключено @test void canWeAddTwoNumbers(){ Утверждения.сбой(“этот тест был пропущен и не должен выполняться”); } ~~~~

Но, когда я учился, мне пришлось приучить себя использовать @Disabled .

Когда я забывал, как отключить метод тестирования, я удалял аннотацию @Test и переименовывал тест:

~~~~~~~~ класс SkipThisTest {

void SKIPTHIScanWeAddTwoNumbers(){
    Assertions.fail("this test was skipped and should not run");
}   

} ~~~~

Это было не очень хорошо, но это сделало свое дело. У меня не было такого Сэнсэя, который помог бы мне вспомнить и вот я начал использовать плохие шаблоны кодирования.

Задачи, которые я взял на себя для этого readme, заключаются в том, чтобы:

  • Создайте правило, которое находит методы, которые были “пропущены” или “отключены” путем переименования метода.
  • Создайте быстрое исправление для переименования метода и добавьте аннотации @test и @Disabled.

Настройки рецепта

Первый шаг, который я делаю с Сенсеем, – это “добавить новый рецепт” и выполнить поиск шаблона кодирования, по которому я хочу, чтобы рецепт действовал.

Name: JUnit: Make @Disabled @Test from SKIPTHIS
Short Description: Stop naming methods SKIPTHIS, use @Disabled @Test instead

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

~~~~ поиск: метод: имя: соответствует: “ПРОПУСТИТЕ ЭТО. *” ~~~~

Быстрое Исправление Настроек

Быстрое исправление немного сложнее, потому что оно перепишет код, и я использую несколько шагов для создания своего окончательного кода.

Я хочу:

  • добавьте аннотацию @Test к методу
  • добавьте аннотацию @Disabled к методу
  • измените название метода

Добавление аннотаций достаточно просто с помощью add Annotation fix. Если я использую полное имя для аннотации, то Сенсей автоматически добавит импорт для меня.

~~~~ Доступные исправления:

  • имя: действия “Добавить @Disabled и @test Аннотацию”:

    • Добавить примечание: аннотация: “@org.junit.jupiter.api. Испытание”
    • Добавить примечание: аннотация: “@org.junit.jupiter.api. Отключен” ~~~~

Фактическое переименование кажется немного более сложным, но я просто использую замену регулярных выражений, и общий способ сделать это с помощью Sensei – использовать sed в действии перезаписи.

Поскольку действия по перезаписи являются шаблонами усов, Сенсей имеет такие функциональные расширения в механизме шаблонов. Функция представлена с помощью {{#...}} так что для sed функция {{#sed}} . Функция принимает два аргумента, разделенных запятыми.

Первый аргумент – это оператор sed :

  • s/(.*) ПРОПУСТИТЕ ЭТО(.*)/$1 $2/

Второй аргумент – это строка для применения инструкции sed , которая в данном случае является самим методом, и она представлена в переменных Mustache как:

  • {{{.}}}
  - rewrite:
       to: "{{#sed}}s/(.*) SKIPTHIS(.*)/$1 $2/,{{{.}}}{{/sed}}"

Реализация sed требует, чтобы, когда сами аргументы содержат запятые, они были обернуты с помощью {{#encodeString}} и {{/encodeString}} – например {{#encodeString}}{{{.}}}{{/Кодировка}}

Обратный рецепт

Поскольку это пример, и мы, возможно, захотим использовать это в демонстрациях, я хотел изучить, как отменить вышеуказанное изменение, используя рецепт Сенсея.

Обдумав это, я хочу найти метод, помеченный @Disabled но только в классе Пропустить этот тест где я делаю демонстрацию:

Name: JUnit: demo in SkipThisTest remove @Disabled and revert to SKIPTHIS
Short Description: remove @Disabled and revert to SKIPTHIS for demo purposes in the project
Level: warning

Поиск настроек рецепта очень прост, он соответствует аннотации в определенном классе.

~~~~ поиск: метод: аннотация: тип: “Отключен” в: классе: имя: “SkipThisTest” ~~~~

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

Для быстрого исправления, поскольку мы подобрали метод, я использую действие перезаписи и заполняю шаблон с помощью переменных.

availableFixes:
- name: "Remove Disabled and rename to SKIPTHIS..."
  actions:
  - rewrite:
      to: "{{{ returnTypeElement }}} SKIPTHIS{{{ nameIdentifier }}}{{{ parameterList\
        \ }}}{{{ body }}}"

Я в основном добавляю все переменные, кроме модификатора (так как я хочу избавиться от аннотаций) и добавляю ПРОПУСТИТЬ ЭТОТ текст в шаблон.

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

Добавить другое действие

Я могу добавить еще одно именованное исправление, чтобы дать мне выбор, когда alt + enter используется для отображения быстрого исправления.

availableFixes:
- name: "Remove Disabled and rename to SKIPTHIS..."
  actions:
  - rewrite:
      to: "{{{ returnTypeElement }}} SKIPTHIS{{{ nameIdentifier }}}{{{ parameterList\
        \ }}}{{{ body }}}"
      target: "self"
- name: "Remove Disabled, keep other annotations, and rename to SKIPTHIS..."
  actions:
  - rewrite:
      to: "{{#sed}}s/(@Disabled\n.*@Test)//,{{{ modifierList }}}{{/sed}}\n\
        {{{ returnTypeElement }}} SKIPTHIS{{{ nameIdentifier }}}{{{ parameterList\
        \ }}}{{{ body }}}"
      target: "self"

Здесь я добавил дополнительную строку в новое быстрое исправление.

{{#sed}}s/(@Disabled\n.*@Test)//,{{{ modifierList }}}{{/sed}}

Это берет список модификаторов, кодирует его как строку, затем использует sed для удаления строки с @Disabled из строки, но оставляет все остальные строки в модификаторе, т.Е. оставляет все остальные аннотации в покое.

ПРИМЕЧАНИЕ: Не забудьте добавить “,” в сед , в противном случае вы увидите комментарий, добавленный к вашему предварительному просмотру, потому что именно так Сенсей предупреждает вас о синтаксических ошибках в сед команда.

Вызовы вложенного набора

Мне повезло, что я смог сопоставить оба @Disabled и @Test в одном поиске и замене.

В том случае, если код более сложный, и я хотел бы иметь последовательность команд sed, я могу сделать это, вложив их:

{{#sed}}s/@Test//,{{#sed}}s/@Disabled\n//,{{{ modifierList }}}{{/sed}}{{/sed}}

В приведенном выше примере я применяю замену @Test к результатам применения замены @Disabled в {{{ modifierList }}} .

Резюме

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

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

записка: Вместо того, чтобы добавлять два доступных исправления, я мог бы клонировать рецепт, но если я это сделаю, то я должен не забыть снять флажок “Добавить запись отключения для клонированного рецепта”, в противном случае для использования будет доступен только клонированный рецепт.

Вы можете установить Sensei из IntelliJ, используя “Настройки \ Плагины” (Mac) или “Настройки \ Плагины” (Windows), затем просто найдите “безопасный код sensei”.

Весь код для этого поста в блоге можно найти на GitHub в модуле junit examples нашего репозитория примеров блога https://github.com/SecureCodeWarrior/sensei-blog-examples

Оригинал: “https://dev.to/securecodewarrior/improving-a-personal-programming-process-using-sensei-hok”