ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 11장 - 단위 테스트의 실제
    클린 코드(Clean Code)/좋은 코드, 나쁜 코드 요약 2023. 12. 20. 00:01
    728x90

    테스트의 장점을 극대화하는 방법들

    • 기능뿐만 아니라 동작을 시험하기
    • 테스트만을 위해 퍼블릭으로 만들지 않기
    • 한 번에 하나의 동작만 테스트하기
    • 공유 설정을 적절하게 사용하기
    • 적절한 assert 구문 활용하기
    • 의존성 주입 활용하기

     

     

    기능뿐만 아니라 동작을 시험하기

    함수당 하나의 테스트 케이스만 있으면 적절하지 않을 때가 많습니다.

    함수 단위로 테스트하는 것이 아니라 실제 행위에 대한 테스트를 수행하는 것이 좋습니다.

    신뢰도를 높이기 위해 여러 가지 값과 경계 조건을 테스트하는 것도 좋습니다.

     

    특정 라인을 삭제해도 테스트가 통과되는지, if문의 논리를 반대로 해도 상관없는지, 상수값이나 하드 코딩된 값을 변경해도 테스트가 통과하는지에 대해 변경해 보고 모든 동작이 잘 수행되는지 확인해 볼 수 있습니다.

     

    또한 정상 동작뿐 아니라 오류 시나리오에 대한 경계를 충실히 수행해야 합니다.

     

     

    테스트만을 위해 퍼블릭으로 만들지 않기

    private 메소드는 구현 세부사항일 가능성이 큽니다.

    이 메소드를 테스트한다는 것은 우리가 신경 쓰는 행동을 테스트하는 것이 아닐 가능성이 큽니다.

     

    public 메서드를 통해 테스트하거나, 코드를 더 작은 단위로 분할하여 테스트가 가능한 구조로 변경할 수 있습니다.

     

     

    한 번에 하나의 동작만 테스트하기

    여러 동작을 한꺼번에 테스트하면 테스트가 정확히 무엇을 하고 있는지 이해하기 어려워집니다.

    이해하기 쉬운 테스트 코드로 우리의 주목적 중 하나이므로 이름만 봐도 테스트가 어떤 것을 의미하는지 명확하게 파악할 수 있으면 좋습니다.

     

    실제 주로 사용하는 예시로 아래와 같이 정책을 명확하게 드러내기도 합니다.

    //BAD CASE
    @Test
    @DisplayName("모든 행위를 테스트합니다")
    void test1(){
    
    }
    
    //GOOD CASE
    @Test
    @DisplayName("사용자 VIEW 정책::변환된 payment data의 카드번호는 앞 4자리만 노출되어야 한다")
    void test2(){
    
    }

     

     

    공유 설정을 적절하게 사용하기

    테스트에 여러 의존성을 설정하기 위해 시간과 노력이 많이 들어갈 수 있습니다.

    많은 테스트 프레임워크에서 테스트 간에 설정을 쉽게 하는 방법을 지원합니다.

     

    일반적으로 다음과 같이 두 가지 시점에서 공유 설정 코드를 실행할 수 있습니다.

    BeforeAll
    BeforeEach

     

    하지만 일반적으로 테스트 케이스가 서로 격리되어야 다른 테스트 끼리 결과에 영향을 미치지 않습니다.

    가능하도록 상태를 공유하지 않는 것이 좋고 상태 공유가 꼭 필요하다면 테스트 케이스에 의해 변경된 상태가 다른 테스트 케이스에 영향을 미치지 않도록 조심해야 합니다.

     

    반복해서 설정하는것 처럼 보일 수 있지만 중요한 설정은 테스트 케이스 내에서 정의하는 것이 좋습니다

     

    간혹 가다 @Sql을 활용하여 공유 DB 설정을 활용하는 경우도 생각나는 것 같습니다.

    이런 경우에는 테스트할 때마다 sql script를 잘 기억하고 있어야 올바른 테스트를 수행할 수 있습니다.

     

    테스트 설정을 공유하는 것은 양남의 검이 될 수 있기 때문에 적절하게 사용해주어야 합니다.

     

     

    의존성 주입 활용하기

    이전 장들에서는 의존성 주입을 사용하면 코드 품질이 개선되는 사례를 알아보았습니다.

    의존성을 주입을 활용하면 테스트 용이성도 크게 향상됩니다.

     

    첫 번째로 하드코딩된 의존성은 테스트를 불가능하게 할 수 있습니다.

    만약 Email을 보내는 클래스를 하드코딩되어 의존하고 있다면 테스트하기 상당히 어려우며 때에 따라서는 테스트가 불가능할 수 있습니다.

     

    만약 의존성 주입이 되어있다면 테스트 더블을 사용하여 테스트 코드에서 FakeEmailSender를 구현해 줄 수 있습니다.

     

     

    다양한 테스트로 소프트웨어의 높은 품질 유지하기

    단위 테스트뿐만 아니라 여러가지 테스트를 적절하게 활용해 주면 소프트웨어의 높은 품질을 유지하는데 도움이 됩니다.

     

    • 통합 테스트 - DB등의 외부 의존성과 엮어서 동작하는지 확인
    • E2E 테스트 - 실제 웹 브라우저에서 사용자가 구매를 완료하는 과정 테스트해 보기
    • 회귀 테스트 - 변경이 발생했을 때 소프트웨어의 동작이나 기능이 잘 동작하는지 수행하는 테스트
    • 골든 테스트 - 테스트 수행 후 코드가 생성한 출력이 다르면 테스트가 실패함, 다만 실패 원인을 찾기 힘듦
    • 퍼즈 테스트 - 많은 무작위 값으로 코드를 호출하는 테스트 (Fixture Monkey와 같은 것들이 있음)

     

    다양한 기술들이 많지만 상황에 따라 적절하게 잘 사용하는 것이 중요합니다.

    댓글

Designed by Tistory.