본문 바로가기

테스트 주도 개발로 배우는 객체지향 설계와 실천 10장 동작하는 골격

반응형

동작하는 골격

1. 대략적인 시스템 구조를 제안

2. 요구사항을 이해(유효성을 검증할 수 있을 정도로)

 

최초 테스트

희망적 관측에 의한 프로그래밍 by Abelson

구현이 이미 존재하는 것처럼 테스트를 작성한 다음 해당 구현이 동작하는 데 필요한 것을 채워나가는 식

 

1. 경매에서 품목을 판매

2. 경매 스나이퍼가 해당 경매에서 입찰을 시작

3. 경매에서는 경매 스나이퍼로부터 Join 요청을 받는다.

4. 경매가 close됐다고 선언되면

5. 경매 스나이퍼는 경매에서 낙찰에 실패했음을 보여준다.

스텁

테스트를 제어해 마치 실제 서비스처럼 동작하는 가짜 경매 서비스가 필요

 

import org.junit.jupiter.api.Test;

public class AuctionSniperEndToEndTest {
    private final FakeAuctionServer auction =
            new FakeAuctionServer("item-54321");
    private final ApplicationRunner application = new ApplicationRunner();

    @Test public void sniperJoinsAuctionUntilAuctionCloses() throws Exception {
        auction.startSellingItem(); // 1단계 경매에서 품목 판매 시작
        application.startBiddingIn(auction); // 2단계 스나이퍼가 입찰 시작
        auction.hasReceivedJoinRequestFromSniper(); // 3단계 경매는 스나이퍼로부터 Join요청을 받는다
        auction.announceClosed(); // 4단계 경매가 close 됐다고 선언하면
        application.showsSniperHasLostAuction(); // 5단계 경매 스나이퍼는 경매에서 낙찰에 실패했음을 보여준다
    }

    // 추가 정리 루틴
    @After public void stopAuction() {
        auction.stop();
    }
    @After public void stopApplication() {
        application.stop();
    }
}

 

어떤 메서드가 이벤트를 발생시켜 테스트를 이끈다면 그 메서드의 이름은 startBiddingIn() 같은 명령(command)이 될 것이다.

어떤 메서드에서 어떤 일이 일어나야 한다고 단정(assert)한다면 해당 메서드의 이름은 showsSniperHasLostAuctions() 같은 서술형이 될 것이다.

이제 테스트를 통과하게 만들어야 한다.

준비해야할 사항이 많다.

1. XMPP 메시지 브로커

2. XMPP를 통해 통신할 수 있는 스텁 경매

3. GUI 테스트 프레임워크

4. 다중 스레드를 지원하고 비동기적인 아키텍처에서 활용 가능한 테스트 설비(harness)

 

이 네 가지 구성 요소를 찾아보거나 직접 작성해야 한다.

그러니 테스트를 작성하는 일이 시스템 개발을 이끌어나간다는 것을 알 수 있다.

테스트를 작성하려면 패키지화와 배포같은 구조적인 측면에 관한 의사 결정을 내려야 하기 때문이다.


전 구간 테스트
이벤트 기반 시스템에 대한 전 구간 테스트에서는 비동기성과 관련된 문제를 해결해야 한다.

이 예제에서는 스윙과 메시지 기반 구조가 모두 비동기적이므로 윈도리커를 사용해 스나이퍼를 이끄는 방식으로 전 구간 테스트의 본연적인 비동기성을 다룬다.

 

시작준비

실제 경매 서비스를 마련하기 쉽지 않기 때문에 실제 경매 서비스를 테스트에 포함하지 않는다.

테스트 대상을 어디까지 바라봐야 하고, 결국 어떻게 모든 부분을 테스트할지 판단하는 것이 중요하다.

 

반응형