개인 프로그래밍 프로세스 개선 Sensei

게시일: 2020.12.07.
by 앨런 리처드슨
사례 연구

개인 프로그래밍 프로세스 개선 Sensei

게시일: 2020.12.07.
by 앨런 리처드슨
리소스 보기
리소스 보기

이 게시물에 대 한, 내가 JUnit을 배울 때 사용 하는 '나쁜' 코딩 접근 방식을 다시 만들었습니다., 그리고 변환 하는 방법을 보여 줄 것 이다 '나쁜' 패턴 동의, 그리고 "더 나은' 코딩 패턴을 사용 하 여 Sensei .

JUnit을 배우고 있을 때, 나는 한 번에 머릿속에 너무 많은 것을 유지할 수 있었습니다. 나는 그들이 작동하지 않을 때 테스트를 건너 뛰는 방법을 끊임없이 잊어 버렸습니다.

팀에서 작업하는 경우 끌어오기 요청에 대한 코드 검토를 사용하여 코딩 스타일을 적용할 수 있습니다. 또한 프로그래밍을 경험이 풍부한 프로그래머와 페어링할 때 피드백 주기를 단축할 수 있습니다.

또한 툴링으로 프로세스를 보강하고 도구가 올바른 작업을 수행하라는 메시지를 표시할 수 있습니다. 사고는 이를 "규칙에 대한 도구"로 묘사했습니다. 기술 레이더 목록 Sensei , 에 : "쉽게 체크 리스트와 같은 거버넌스 규칙 및 절차를 적용보다 올바른 일을 할 수 있도록"


JUnit 테스트 비활성화


이상적으로, 나는 우리 모두가 알다시피, @Disabled 기조를 사용하고 쓰기 :

  @Disabled
  @Test
  void canWeAddTwoNumbers(){
        Assertions.fail("this test was skipped and should not run");
   }

하지만, 배울 때, 나는 @Disabled 사용하기 위해 자신을 훈련했다.

테스트 방법을 사용하지 않도록 설정하는 방법을 잊어 버렸을 때 @Test 부조를 제거하고 테스트 이름을 변경합니다.

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


그것은 좋지 않았지만, 그것은 일을 완료있어. 나는 같은 것을 가지고 있지 않았다. Sensei 내가 기억하는 데 도움이 그래서 나는 가난한 코딩 패턴을 사용하여 떨어졌다.

이 게시물에 대해 기내에서 수행한 작업은 다음과 같습니다.

  • 메서드이름을 변경하여 '건너뛴' 또는 '비활성화' 된 메서드를 찾는 규칙을 만듭니다.
  • QuickFix를 만들어 메서드의 이름을 변경하고 @Test 및 @Disabled @Disabled 추가합니다.


레시피 설정

내가 가지고 첫 번째 단계 Sensei "새로운 레시피를 추가하고 레시피가 작동하려는 코딩 패턴을 검색하는 것입니다.

이름: JUnit: 건너뛰기에서 @Disabled @Test 확인

짧은 설명: 건너뛰기 메서드 를 중지하고 대신 @Disabled @Test 사용


그리고 내 검색은 매우 간단합니다. 기본 레펙스를 사용하여 메서드 이름에 맞게 합니다.

검색:
메서드:
이름:
일치 항목: "건너뛰기.*"


테스트를 건너뛰기 위한 레시피 설정


퀵픽스 설정

QuickFix는 코드를 다시 작성하기 때문에 조금 더 복잡하며 최종 코드를 얻기 위해 몇 단계를 사용합니다.

하고 싶어요:

  • 메서드에 @Test 추가
  • 메서드에 @Disabled 기고 추가
  • 메서드 이름 수정

주석을 추가하는 것은 addAnnotation 수정프로그램을 사용하여 충분히 간단합니다. 내가 부기에 대한 자격을 갖춘 이름을 사용하는 경우 다음 Sensei 자동으로 나를 위해 수입을 추가합니다.

사용 가능한 픽스:
- 이름 : "@Disabled 추가하고 @Test 성서"
  작업:
- 추가 안장 :
"@org.junit.jupiter.api.test"
- 추가 안장 :
"@org.junit.jupiter.api.비활성화"


실제 이름 변경은 좀 더 복잡해 보이지만 regex 교체를 사용하고 있으며 이를 수행하는 일반적인 방법입니다. Sensei 재작성 작업에 는 sed를 사용하는 것입니다.

다시 쓰기 작업은 콧수염 템플릿이므로 Sensei 템플릿 메커니즘에 몇 가지 기능 확장이 있습니다. 함수는 {{#...}}}로 표현되므로 sed의 함수는 {{#sed}입니다. 이 함수는 두 개의 쉼표 구분 인수를 합니다.

첫 번째 인수는 sed 문입니다.

  • s/(.*) SKIPTHIS(.*)/$1 $2/

두 번째 인수는 sed 문을 적용하는 문자열이며,이 경우 메서드 자체이며, 이것은 콧수염 변수에 다음과 같이 표시됩니다.

  • {{{.}}}

나에게 의 재작성 작업을 제공 :

 - 다시 작성 :

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



sed 구현은 인수 자체에 쉼표를 포함할 때 {{#encodeString}} 및 {{/인코딩}}}로 래핑되어 있어야 합니다 #encodeString. {{/인코딩스트링}}

역 조리법

이 예제이므로 데모에서 이 작업을 사용할 수 있으므로 위의 변경 을 사용하여 반전하는 방법을 살펴보고 싶었습니다. Sensei 처방.

나는 @Disabled 만 클래스 SkipThisTest에서 내가 데모를 할 수있는 방법을 찾고 싶습니다 통해 그것을 통해 생각 :

이름: JUnit: SkipThisTest에서 데모 @Disabled 제거하고 건너 뛰기로 되돌리기

짧은 설명: @Disabled 제거하고 프로젝트의 데모 목적으로 SKIPTHIS로 되돌리기

레벨: 경고


레시피 설정 검색은 특정 클래스의 부조와 일치하므로 매우 간단합니다.

검색:
메서드:
주석:
유형: "사용 중"
안으로:
수업:
이름: "건너뛰기테스트"


코드가 오류처럼 보이게하지 않으려면 레시피의 일반적인 설정을 경고로 정의했습니다. 경고는 코드의 하이라이트와 함께 표시되며 코드가 큰 문제가 있는 것처럼 보이게 하지 않습니다.

빠른 수정의 경우 메서드와 일치했기 때문에 재작성 작업을 사용하고 변수를 사용하여 템플릿을 채웁니다.

사용 가능한 픽스:
- 이름 : "비활성화 제거하고 건너 뛰기로 이름을 변경 ..."
  actions:
  - rewrite:
      to: "{{{ returnTypeElement }}} SKIPTHIS{{{ nameIdentifier }}}{{{ parameterList\
        \ }}}{{{ body }}}"


수정자를 제외한 모든 변수를 추가하고(주석을 제거하려면) SKIPTHIS 텍스트를 템플릿에 추가합니다.

이 수정 사항에서는 수정자를 제거하여 다른 주석도 제거하는 약점이 있습니다.


다른 작업 추가

나는 alt+enter가 QuickFix를 표시하는 데 사용될 때 나에게 선택을 제공하기 위해, 또 다른 명명 된 수정을 추가 할 수 있습니다.

사용 가능한 픽스:
- 이름 : "비활성화 제거하고 건너 뛰기로 이름을 변경 ..."
  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}/(@Disabled\n.*@Test)///{{{수정자목록 }}{{/sed}}


이렇게 하면 수정자 목록이 가져와 문자열로 인코딩한 다음 sed를 사용하여 문자열에서 @Disabled 줄을 제거하지만 다른 모든 줄은 수정자(예: 다른 모든 주석만 남깁니다)를 남깁니다.

참고: sed에 """를 추가하면 미리 보기에 주석이 추가됩니다. 이것이 다음과 같은 방법입니다. Sensei sed 명령의 구문 오류를 경고합니다.

/* e.g: {{#sed}}s/all/world/,helloall{{/sed}} */


중첩 된 sed 통화

나는 하나의 검색과 교체에 @Disabled @Test 모두 일치 할 수 운이 좋았다.

코드가 더 복잡하고 sed 명령 시퀀스를 갖고 싶다면 중첩하여 작업을 수행할 수 있습니다.

{{{#sed}/@Test/,{{{#sed}/@Disabled\n/,{{{{{{수정자목록}}}{/sed}} }


위의 예제에서는 {{{수정자 }}}}에 @Disabled 교체를 적용한 결과에 @Test 교체를 적용합니다.


요약

sed는 코드 재작성을 달성하는 매우 유연한 방법이며 복잡한 재작성 조건에 대한 sed 함수 호출을 중첩할 수 있습니다.

이와 같은 조리법은 종종 우리가 우리의 프로그래밍 프로세스를 개선하기 위해 그들을 사용하고 있기 때문에 일시적 인 결국, 우리는 근육 메모리를 구축하고 더 이상 우리가 제거하거나 쿡 북에서 비활성화 할 수있는 가난한 프로그래밍 패턴을 사용하지 않습니다.


---

설치할 수 있습니다. Sensei "환경 설정 \ 플러그인"(맥) 또는 "설정 \ 플러그인"(윈도우)를 사용하여 IntelliJ 내에서 다음 그냥 검색 " sensei 보안 코드".
이 블로그 게시물의 모든 코드는 블로그 예제 리포지토리의 '주니예제' 모듈에서 GitHub에서 찾을 수 있습니다. https://github.com/SecureCodeWarrior/ sensei -블로그 예

리소스 보기
리소스 보기

저자

앨런 리처드슨

더 알고 싶으신가요?

블로그에서 최신 보안 코딩 인사이트에 대해 자세히 알아보세요.

Atlassian의 광범위한 리소스 라이브러리는 안전한 코딩 숙련도를 확보하기 위한 인적 접근 방식을 강화하는 것을 목표로 합니다.

블로그 보기
더 알고 싶으신가요?

개발자 중심 보안에 대한 최신 연구 보기

광범위한 리소스 라이브러리에는 개발자 중심의 보안 코딩을 시작하는 데 도움이 되는 백서부터 웨비나까지 유용한 리소스가 가득합니다. 지금 살펴보세요.

리소스 허브

개인 프로그래밍 프로세스 개선 Sensei

게시일: 2020.12.07.
By 앨런 리처드슨

이 게시물에 대 한, 내가 JUnit을 배울 때 사용 하는 '나쁜' 코딩 접근 방식을 다시 만들었습니다., 그리고 변환 하는 방법을 보여 줄 것 이다 '나쁜' 패턴 동의, 그리고 "더 나은' 코딩 패턴을 사용 하 여 Sensei .

JUnit을 배우고 있을 때, 나는 한 번에 머릿속에 너무 많은 것을 유지할 수 있었습니다. 나는 그들이 작동하지 않을 때 테스트를 건너 뛰는 방법을 끊임없이 잊어 버렸습니다.

팀에서 작업하는 경우 끌어오기 요청에 대한 코드 검토를 사용하여 코딩 스타일을 적용할 수 있습니다. 또한 프로그래밍을 경험이 풍부한 프로그래머와 페어링할 때 피드백 주기를 단축할 수 있습니다.

또한 툴링으로 프로세스를 보강하고 도구가 올바른 작업을 수행하라는 메시지를 표시할 수 있습니다. 사고는 이를 "규칙에 대한 도구"로 묘사했습니다. 기술 레이더 목록 Sensei , 에 : "쉽게 체크 리스트와 같은 거버넌스 규칙 및 절차를 적용보다 올바른 일을 할 수 있도록"


JUnit 테스트 비활성화


이상적으로, 나는 우리 모두가 알다시피, @Disabled 기조를 사용하고 쓰기 :

  @Disabled
  @Test
  void canWeAddTwoNumbers(){
        Assertions.fail("this test was skipped and should not run");
   }

하지만, 배울 때, 나는 @Disabled 사용하기 위해 자신을 훈련했다.

테스트 방법을 사용하지 않도록 설정하는 방법을 잊어 버렸을 때 @Test 부조를 제거하고 테스트 이름을 변경합니다.

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


그것은 좋지 않았지만, 그것은 일을 완료있어. 나는 같은 것을 가지고 있지 않았다. Sensei 내가 기억하는 데 도움이 그래서 나는 가난한 코딩 패턴을 사용하여 떨어졌다.

이 게시물에 대해 기내에서 수행한 작업은 다음과 같습니다.

  • 메서드이름을 변경하여 '건너뛴' 또는 '비활성화' 된 메서드를 찾는 규칙을 만듭니다.
  • QuickFix를 만들어 메서드의 이름을 변경하고 @Test 및 @Disabled @Disabled 추가합니다.


레시피 설정

내가 가지고 첫 번째 단계 Sensei "새로운 레시피를 추가하고 레시피가 작동하려는 코딩 패턴을 검색하는 것입니다.

이름: JUnit: 건너뛰기에서 @Disabled @Test 확인

짧은 설명: 건너뛰기 메서드 를 중지하고 대신 @Disabled @Test 사용


그리고 내 검색은 매우 간단합니다. 기본 레펙스를 사용하여 메서드 이름에 맞게 합니다.

검색:
메서드:
이름:
일치 항목: "건너뛰기.*"


테스트를 건너뛰기 위한 레시피 설정


퀵픽스 설정

QuickFix는 코드를 다시 작성하기 때문에 조금 더 복잡하며 최종 코드를 얻기 위해 몇 단계를 사용합니다.

하고 싶어요:

  • 메서드에 @Test 추가
  • 메서드에 @Disabled 기고 추가
  • 메서드 이름 수정

주석을 추가하는 것은 addAnnotation 수정프로그램을 사용하여 충분히 간단합니다. 내가 부기에 대한 자격을 갖춘 이름을 사용하는 경우 다음 Sensei 자동으로 나를 위해 수입을 추가합니다.

사용 가능한 픽스:
- 이름 : "@Disabled 추가하고 @Test 성서"
  작업:
- 추가 안장 :
"@org.junit.jupiter.api.test"
- 추가 안장 :
"@org.junit.jupiter.api.비활성화"


실제 이름 변경은 좀 더 복잡해 보이지만 regex 교체를 사용하고 있으며 이를 수행하는 일반적인 방법입니다. Sensei 재작성 작업에 는 sed를 사용하는 것입니다.

다시 쓰기 작업은 콧수염 템플릿이므로 Sensei 템플릿 메커니즘에 몇 가지 기능 확장이 있습니다. 함수는 {{#...}}}로 표현되므로 sed의 함수는 {{#sed}입니다. 이 함수는 두 개의 쉼표 구분 인수를 합니다.

첫 번째 인수는 sed 문입니다.

  • s/(.*) SKIPTHIS(.*)/$1 $2/

두 번째 인수는 sed 문을 적용하는 문자열이며,이 경우 메서드 자체이며, 이것은 콧수염 변수에 다음과 같이 표시됩니다.

  • {{{.}}}

나에게 의 재작성 작업을 제공 :

 - 다시 작성 :

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



sed 구현은 인수 자체에 쉼표를 포함할 때 {{#encodeString}} 및 {{/인코딩}}}로 래핑되어 있어야 합니다 #encodeString. {{/인코딩스트링}}

역 조리법

이 예제이므로 데모에서 이 작업을 사용할 수 있으므로 위의 변경 을 사용하여 반전하는 방법을 살펴보고 싶었습니다. Sensei 처방.

나는 @Disabled 만 클래스 SkipThisTest에서 내가 데모를 할 수있는 방법을 찾고 싶습니다 통해 그것을 통해 생각 :

이름: JUnit: SkipThisTest에서 데모 @Disabled 제거하고 건너 뛰기로 되돌리기

짧은 설명: @Disabled 제거하고 프로젝트의 데모 목적으로 SKIPTHIS로 되돌리기

레벨: 경고


레시피 설정 검색은 특정 클래스의 부조와 일치하므로 매우 간단합니다.

검색:
메서드:
주석:
유형: "사용 중"
안으로:
수업:
이름: "건너뛰기테스트"


코드가 오류처럼 보이게하지 않으려면 레시피의 일반적인 설정을 경고로 정의했습니다. 경고는 코드의 하이라이트와 함께 표시되며 코드가 큰 문제가 있는 것처럼 보이게 하지 않습니다.

빠른 수정의 경우 메서드와 일치했기 때문에 재작성 작업을 사용하고 변수를 사용하여 템플릿을 채웁니다.

사용 가능한 픽스:
- 이름 : "비활성화 제거하고 건너 뛰기로 이름을 변경 ..."
  actions:
  - rewrite:
      to: "{{{ returnTypeElement }}} SKIPTHIS{{{ nameIdentifier }}}{{{ parameterList\
        \ }}}{{{ body }}}"


수정자를 제외한 모든 변수를 추가하고(주석을 제거하려면) SKIPTHIS 텍스트를 템플릿에 추가합니다.

이 수정 사항에서는 수정자를 제거하여 다른 주석도 제거하는 약점이 있습니다.


다른 작업 추가

나는 alt+enter가 QuickFix를 표시하는 데 사용될 때 나에게 선택을 제공하기 위해, 또 다른 명명 된 수정을 추가 할 수 있습니다.

사용 가능한 픽스:
- 이름 : "비활성화 제거하고 건너 뛰기로 이름을 변경 ..."
  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}/(@Disabled\n.*@Test)///{{{수정자목록 }}{{/sed}}


이렇게 하면 수정자 목록이 가져와 문자열로 인코딩한 다음 sed를 사용하여 문자열에서 @Disabled 줄을 제거하지만 다른 모든 줄은 수정자(예: 다른 모든 주석만 남깁니다)를 남깁니다.

참고: sed에 """를 추가하면 미리 보기에 주석이 추가됩니다. 이것이 다음과 같은 방법입니다. Sensei sed 명령의 구문 오류를 경고합니다.

/* e.g: {{#sed}}s/all/world/,helloall{{/sed}} */


중첩 된 sed 통화

나는 하나의 검색과 교체에 @Disabled @Test 모두 일치 할 수 운이 좋았다.

코드가 더 복잡하고 sed 명령 시퀀스를 갖고 싶다면 중첩하여 작업을 수행할 수 있습니다.

{{{#sed}/@Test/,{{{#sed}/@Disabled\n/,{{{{{{수정자목록}}}{/sed}} }


위의 예제에서는 {{{수정자 }}}}에 @Disabled 교체를 적용한 결과에 @Test 교체를 적용합니다.


요약

sed는 코드 재작성을 달성하는 매우 유연한 방법이며 복잡한 재작성 조건에 대한 sed 함수 호출을 중첩할 수 있습니다.

이와 같은 조리법은 종종 우리가 우리의 프로그래밍 프로세스를 개선하기 위해 그들을 사용하고 있기 때문에 일시적 인 결국, 우리는 근육 메모리를 구축하고 더 이상 우리가 제거하거나 쿡 북에서 비활성화 할 수있는 가난한 프로그래밍 패턴을 사용하지 않습니다.


---

설치할 수 있습니다. Sensei "환경 설정 \ 플러그인"(맥) 또는 "설정 \ 플러그인"(윈도우)를 사용하여 IntelliJ 내에서 다음 그냥 검색 " sensei 보안 코드".
이 블로그 게시물의 모든 코드는 블로그 예제 리포지토리의 '주니예제' 모듈에서 GitHub에서 찾을 수 있습니다. https://github.com/SecureCodeWarrior/ sensei -블로그 예

우리는 당신에게 우리의 제품 및 / 또는 관련 보안 코딩 주제에 대한 정보를 보낼 수있는 귀하의 허가를 바랍니다. 우리는 항상 최대한의주의를 기울여 귀하의 개인 정보를 취급 할 것이며 마케팅 목적으로 다른 회사에 판매하지 않을 것입니다.

전송
양식을 제출하려면 '분석' 쿠키를 활성화하세요. 완료되면 언제든지 다시 비활성화할 수 있습니다.