Review: 소프트웨어 개발의 지혜 - 4장_테스트

백근영·2020년 3월 25일
0
post-thumbnail

테스트 주도적 개발

TDD를 하는 방법은 간단하다. 프로그램을 설계하기 전에 테스트 코드부터 작성하는 것이다. 단순한 방법이지만, 이렇게 함으로써 여러가지 이득을 얻을 수 있다.

검증

개발 과정에서 작성하게 되는 모든 코드는 기능을 검증할 수 있는 테스트 코드를 갖게 된다. 빈번하게 변경이 일어날 때마다 올바르게 작동하고 있는지를 검증받을 수 있는 수단이 언제나 존재하므로, 리팩토링을 용이하게 한다.

설계 의사 결정에 관여

테스트를 먼저 작성함으로써 올바른 설계를 향한 고민을 자연스럽게 하게 될 수 있다. 예를 들어 hunt the wumpus 게임을 생각해보자. 이 게임은 wumpus(여러 개의 방이 연결된 동굴에 사는 괴물)에게 잡아먹히기 전에 먼저 wumpus를 처치하는 간단한 게임이다. 개발자는 이 게임을 만들기 위한 첫 단계로 '동굴의 방 사이를 이동하기' 기능을 만들어 보려 한다. 이 기능에 대한 테스트 코드는 다음과 같다.

public void testMove() {
    WumpusGame g = new WumpusGame();
    g.connect(4, 5, "E");
    g.setPlayerRoom(4);
    g.east();
    assertEquals(5, g.getPlayerRoom());
}

이 테스트 코드에서는 4번방과 5번방을 동쪽 방향으로 연결하고, 플레이어를 4번방에 둔 뒤 동쪽으로 한 칸 이동시킨다. 그러면 이 플레이어는 5번방에 있을 것이라고 기대할 수 있다.

개발자가 이 코드를 작성하면서 할 수 있었던 고민은 '방'의 개념을 표현하는데 Room 객체가 따로 필요한가? 에 관한 것이었다. 분명 이 게임에 등장하는 동굴은 여러 개의 '방'으로 이루어져 있으며, 따라서 '방'이라는 개념은 이 소프트웨어에서 매우 중요한 개념이라고 생각될 수 있다. 하지만 개발자는 이 테스트 코드를 작성하면서 Room 객체는 한번도 쓰지 않고, 단지 정수로 방의 개념을 표현했다.

중요한 것은 어느 것이 옳은가에 대한 답이 아니라, TDD를 통해 더 나은 설계를 위한 고민의 기회가 주어졌다는 것이다. TDD는 아주 이른 시기에 중심 설계의 이슈를 명백히 할 수 있다.

분리

코드가 테스트를 통과하기 위해서는 테스트에 적합한 코드여야 하며, 테스트에 적합한 코드는 적절한 분리를 강제한다. 코드의 적절한 분리는 객체 지향 설계의 핵심인 '변경에는 닫혀 있고 확장에는 열려 있는' 설계를 이루는 데에 도움을 줄 것이다.

profile
서울대학교 컴퓨터공학부 github.com/BaekGeunYoung

0개의 댓글