Добавление аннотаций и Переименование методов
Для этого поста я воссоздал “плохой” подход к кодированию, который я использовал, когда изучал 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”