단위 테스트의 세 가지 스타일

단위 테스트는 아래와 같이 세 가지 스타일이 있다. 하나의 테스트에서 하나 이상의 스타일이 사용될 수 있다.

 

1. 출력 기반 테스트

테스트 대상 시스템(SUT)에 입력을 넣고 생성되는 출력을 점검하는 방식이다. 해당 단위 테스트 스타일은 전역 상태가 내부 상태를 변경하지 않는 코드에만 적용되므로 반환 값만 검증하면 된다.

 

출력 기반 테스트는 시스템이 생성하는 출력을 검증한다. 사이드 이펙트가 없고 작업 결과는 호출자에게 반환하는 값 뿐이다.

 

2. 상태 기반 테스트

상태 기반 테스트는 작업이 완료된 후 시스템 상태를 확인한다. 여기서 상태란 SUT나 협력자, 또는 데이터베이스나 파일 시스템과 같은 프로세스 외부 의존성의 상태를 의미한다.

 

다음은 상태 기반 테스트의 예제다. 클라이언트가 Order를 통해 상품을 주문하고 products 컬렉션을 검증한다.

public class Order {
  private List<Product> products = new ArrayList();
  
  public void addProduct(Product product) {
    products.add(product);
  }
  
  public void getProductOfIndex(int index) {
    return products.get(index);
  }
  
  public int getProductsSize() {
    return products.size()
  }
}

---

@Test
public void add_a_product_to_an_order() {
  Product product = new Product("Hand wash");
  Order sut = new Order();
  
  sut.addProduct(product);
  
  assertThat(sut.getProductOfIndex(0)).isEqualTo(product);
  assertThat(sut.getProductsSize).isEqualTo(1);
}

 

 

3. 통신 기반 테스트

이 스타일은 목을 사용해 테스트 대상 시스템과 협력자 간의 통신을 검증한다. 가급적이면 애플리케이션 경계를 넘는 상호 작용을 확인하고 해당 상호 작용의 사이드 이펙트가 외부 환경에 보이는 경우에만 사용하는 것이 권장된다. 외부 환경에서 보이지 않거나 프로세스 내부 상호작용의 경우는 구현 세부 사항에 해당되기 때문에 부적합하다.

 

스타일 비교

  출력 기반 상태 기반 통신 기반
리팩터링 내성을 지키기 위해 필요한 노력 낮음 중간 중간
유지비 낮음 중간 높음

세 스타일 중에 출력 기반 테스트가 가장 좋다. 그 이유는 다음과 같다.

  1. 구현 세부 사항과 거의 결합되지 않기 때문에 리팩터링 내성을 쉽게 유지할 수 있다.
  2. 테스트가 간결하고 프로세스 외부 의존성이 없기 때문에 유지 보수도 쉽다.

그러므로 출력 기반 테스트를 우선적으로 고려하고, 필요한 경우에만 다른 스타일을 사용하자.

 

+ Recent posts