티스토리 뷰

반응형

단위 테스트 3장 내용을 기반으로 하고 있습니다.


 

[ 저자가 생각하는 단위테스트 네이밍 안티패턴 ]

 

1. 엄격한 명명구조

 

가장 유명하지만 가장 도움이 되지 않는 방법 중 하나가 다음과 같은 관습이다.

[테스트 대상 메서드]_[시나리오]_[예상결과]

 

- 테스트 대상 메서드: 테스트 중인 메서드의 이름

- 시나리오: 메서드를 테스트하는 조건

- 예상결과: 현재 시나리오에서 테스트 대상 메서드에 기대하는 것

 

동작 대신 구현 세부사항에 집중하게끔 부추기기 때문에 분명히 도움이 되지 않는다.

간단하고 쉬운 영어 구문이 훨씬 더 효과적이다. 

 

예를들어 

public class CalculatorTests {

      public void Sum_of_two_numbers() {
             ...
             // when
             double result = sut.Sum(first, second);
             
             // then
             Assert.Equal(30, result)
      }
}

 

이 테스트이름을 저 규칙으로 쓴다면 이렇게 된다.

public void Sum_TwoNumbers_ReturnsSum()

 

가독성에 도움이 되지 않고 관련 지식이 충분하지 않은 사람에게는 그리스어로 보인다;;

별것 아닌 것 같지만 시간이 지날수록 정신적으로 부담이 가중되고 전체 테스트 스위트의 유지비가 천천히 늘어난다.

쉬운 영어로 작성한 이름이 읽기에 훨씬 간결하다. 

 

- 엄격한 명명 정책의 좁은 상자안에 다 넣을 수 없다. 표현의 자유를 허락하라. 

- 문제 도메인에 익숙한 비개발자들에게 시나리오를 설명하는 것처럼 테스트 이름을 짓자.

 

 

2.  SUT의 메서드 이름을 포함하는 것 

코드를 테스트하는 것이 아니라 애플리케이션 동작을 테스트하는 것이라는 점을 명심하자.

테스트 대상 메서드 이름이 중요하지 않다.

 

동작 대신 코드를 목표로 하면 해당 코드의 구현 세부사항과 테스트 간의 결합도가 높아진다. 

또한 테스트 대상 메서드 이름을 변경하면 테스트 이름도 바꿔야한다.

 

이 지침의 유일한 예외는 유틸리티 코드를 작업할 때다. (유틸리티 코드는 비즈니스 로직이 없고, 코드의 동작이 단순한 보조 기능이므로)

 

예를들어 과거 배송일이 유효하지 않다는 것을 검증하는 테스트를 살펴보자. 

public void IsDeliveryValid_InvalidDate_ReturnsFalse() {
       .... 
       // when
       bool isValid = sut.IsDeliveryValid();
       ...
}

 

sut 메서드 이름 (IsDeliveryValid) 를 테스트명에 포함하지 않게 바꿔보자.

public void Delivery_with_past_should_be_considered_invalid()

 

더 간결/명확하게 한번 더 바꾸자. 

 

public void Delivery_with_past_date_should_be_invalid()

 

 

3. should be 문구

 

should be 문구는 또다른 일반적인 안티 패턴이다. 

이전 장에서 하나의 테스트는 동작 단위에 대해 단순하고 원자적인 사실이라고 했다.

사실을 서술할 때는 소망이나 욕구가 들어가지 않는다.

should be 를 is로 바꿔보자. 

public void Delivery_with_past_date_is_invalid()

 

 

기초 영문법을 지켜 테스트를 완벽하게 읽을 수 있도록 관사 a 도 추가하자

public void Delivery_with_a_past_date_is_invalid()

 

 

 

[ 정리 ]

1. 엄격한 명명 패턴 쓰지 말자 
    ->  간단하고 쉬운 영어 / 도메인에 익숙한 비개발자들도 이해할 수 있게 네이밍 

 

2. 테스트 이름에 테스트하려는 메서드 이름 쓰지 말자 

    -> 코드아니라 동작테스트하는 것이다 / 구현과 강결합 시키지 말자  

 

3. should be 말고 is 쓰자 

    -> 테스트는 동작 단위에 대한 사실이다.

4.  (외국인동료들과 일한다면) 기초 영문법 지켜서 a 도 신경쓰자 

     -> 그들은 심히 거슬릴 것이다..

 

 

 

반응형
댓글