Hello, Freakin world!

[채팅앱][클라이언트] EventLoop 클래스 작성하기 - 반드시 단위 테스트 작성해야만 하는가에 대해서 본문

Toy Project/채팅 앱 만들기

[채팅앱][클라이언트] EventLoop 클래스 작성하기 - 반드시 단위 테스트 작성해야만 하는가에 대해서

johnna_endure 2020. 2. 27. 05:35
public class EventLoop extends Thread{
    Selector selector;
    EventHandler eventHandler = new EventHandler();
    Logger logger = Logger.getLogger(EventLoop.class.getCanonicalName());

    public EventLoop(Selector selector) {
        this.selector = selector;
        Thread.currentThread().setDaemon(true);
    }

    @Override
    public void run() {
        logger.entering("EventLoop", "run");
        while(true) {
            try {
                selector.select();
                logger.fine("[클라이언트][이벤트루프] : select() 호출됨.");
            } catch (IOException e) {
                e.printStackTrace();
            }

            Set<SelectionKey> selectionKeySet = selector.selectedKeys();
            for (SelectionKey key : selectionKeySet) {
                eventHandler.delegate(key);
            }
        }
    }
}

생각보다 간단하다.

주입받은 selector 객체를 이용해 이벤트들을 Set 자료구조로 얻은 다음, 루프를 돌면서 이벤트 핸들러에 처리를 위임한다.


근데 저 클래스는 어떻게 테스트할 수 있을까?

난감하다.

 

애초에 클래스 설계에서부터 이 클래스는 반환값이 없는 부수효과를 기반으로 한 클래스다.
이벤트가 들어오면 이벤트를 핸들러로 위임하는게 역할의 전부인데, 위임하는 일 자체는 아무것도 반환하지 않는 부수효과다.

 

그리고 테스트한다면 뭘 테스트 해야하는걸까? 핸들러가 제대로 호출되는지 테스트해야되나? 그런데 호출의 여부는 코드에서 이미 명시적으로 나와있지 않나? 이는 코드가 제대로 기능을 하는지 여부와는 다른데, 이를테면 더 로우레벨의 이야기가 아닌가?

결론

 단위 테스트로 이 클래스의 기능을 테스트하는 것은 의미가 없어보인다.
이 메서드가 관여하는 프로세스의 흐름을 측정해야 하는데, 이를 위해서는 일련의 '동작 테스트'가 필요해보인다.
내가 말한 '동작 테스트'는 여러 컴포넌트들을 조합해 여러 시나리오를 이용해 특정 결과를 내는지 알아보는 테스트다.

Comments