
단위 테스트 해석의 차이가 생겼고, 단위 테스트에 접근하는 방법이 두 가지의 견해로 나뉘었다.
그것은 바로 고전파(Classical school)와 런던파(London school)이다.
단위 테스트에는 많은 정의가 있지만, 가장 중요한 속성이 있다.
- 작은 코드 조각(단위라고도 함)을 검증하고,
- 빠르게 수행하고,
- 격리된 방식으로 처리하는 자동화된 테스트다.
세 가지 중 가장 의견이 갈린 것은 세 번째 속성이다.
두 분파간의 모든 차이는 격리가 정확히 무엇인지에 대한 의견 차이 하나로 시작했다.
격리 문제에 대한 런던파의 접근
런던파에서는 하나의 클래스가 다른 클래스 또는 여러 클래스에 의존하면 이 모든 의존성을 테스트 대역(test double)으로 대체한다. 동작을 외부 영향과 분리해서 테스트 대상 클래스에만 집중할 수 있다. 이 방법의 이점은 아래와 같이 두 가지가 있다.
- 테스트가 실패하면 코드베이스의 어느 부분이 고장 났는지 확실히 알 수 있다는 것이다.
- 객체 그래프(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 |
---|