단위 테스트 해석의 차이가 생겼고, 단위 테스트에 접근하는 방법이 두 가지의 견해로 나뉘었다. 
그것은 바로 고전파(Classical school)런던파(London school)이다. 

단위 테스트에는 많은 정의가 있지만, 가장 중요한 속성이 있다. 

- 작은 코드 조각(단위라고도 함)을 검증하고, 
- 빠르게 수행하고,
- 격리된 방식으로 처리하는 자동화된 테스트다. 

세 가지 중 가장 의견이 갈린 것은 세 번째 속성이다. 
두 분파간의 모든 차이는 격리가 정확히 무엇인지에 대한 의견 차이 하나로 시작했다. 

 

격리 문제에 대한 런던파의 접근

런던파에서는 하나의 클래스가 다른 클래스 또는 여러 클래스에 의존하면 이 모든 의존성을 테스트 대역(test double)으로 대체한다. 동작을 외부 영향과 분리해서 테스트 대상 클래스에만 집중할 수 있다. 이 방법의 이점은 아래와 같이 두 가지가 있다. 

 

  1. 테스트가 실패하면 코드베이스의 어느 부분이 고장 났는지 확실히 알 수 있다는 것이다.
  2. 객체 그래프(object graph)를 분할할 수 있다. 
    : 의존성을 가진 코드베이스를 테스트하는 것은 테스트 대역 없이 어렵다. 의존성에 의한 객체 그래프가 복잡해질 경우, 그래프를 다시 그릴 수 밖에 없는데, 테스트 대역을 사용하면 객체 그래프를 다시 만들지 않아도 된다. 

 

자, 고전파와 런던파의 테스트 코드를 비교해보자. 

public void Purchase_succeeds_when_enough_inventory() {
  // 준비
  var store = new Store();
  store.AddInventory(Product.Shampoo, 10);
  var customer = new Customer();
  
  // 실행
  bool success = customer.Purchase(storek Product.Shampoo, 5);
  
  //검증
  Assert.True(success);
  Assert.Equals(S, store.GetInventory(Product.Shampoo));
}

위 테스트 코드는 고전 스타일 예로, 테스트는 협력자(Store 클래스)를 대체하지 않고 운영용 인스턴스를 사용한다.
보다시피 테스트에서 Store, Customer 두 클래스가 서로 격리되어 있지 않다. 

 

public void Purchase_succeeds_when_enough_inventory() {
  // 준비
  var storeMock = new Mock<IStore>();
  storeMock
    .Setup(x => x.HasEnoughInventory(Product.Shampoo, 5))
    .Returns(true);
  var customer = new Customer();
  
  // 실행
  bool success = customer.Purchase(
    storeMock.Object, Product.Shampoo, 5);
  
  // 검증
  Assert.True(success);
  storeMock.Verify(
    x => x.RemoveInventory(Product.Shampoo, 5),
    times.Once);
}

위는 런던파 스타일의 테스트 코드이다. 준비 단계에서 테스트는 Store의 실제 인스턴스를 생성하지 않고 목(Mock)을 사용하여 대체한다. 이를 통해, 고객이 상점으로 호출해야 하는 메서드(x.RemoveInventory)뿐만 아니라 호출 횟수까지 검증할 수 있다. 

 

격리 문제에 대한 고전파의 접근

고전적인 방법에서는 코드를 꼭 격리하는 방식으로 테스트하는 것이 아니라 단위 테스트를 서로 격리해서 실행해야 한다. 
이렇게 하면 서로 영향을 미치지 않고 테스트를 수행할 수 있다. 
각각의 테스트를 격리하는 것은 여러 클래스가 모두 메모리에 상주하고 공유 상태에 도달하지 않는 한(ex. 데이터베이스, 파일 시스템 등), 여러 클래스를 한 번에 테스트해도 괜찮다는 뜻이다. 

 

요약하자면

  • 런던파: 하나의 클래스가 다른 클래스에 의존하면 테스트 대역을 사용
  • 고전파: 테스트 대역을 사용하지 않고, 테스트를 서로 격리해서 실행
반응형

'Testing' 카테고리의 다른 글

Unit Testing 1장 :: 단위 테스트의 목표  (0) 2022.11.02
복사했습니다!