단위 테스트 케이스와 테스트 더블(Test Double)

Yoo Young-mo
Apr 20, 2016 · 3 min read

단위 테스트 케이스(Unit Test Case)는 테스트 맥락에 따라 여러 가지 의미로 해석할 수 있다. 이 글은 프로그래밍 관점에서 이야기 한다.

프로그래밍 관점에서 어떤 ‘단위(Unit)’로 테스트 케이스를 작성 하느냐는 프로그래밍 언어 마다 다르다. 예를 들면 Java는 Class 혹은 Method 가 단위가 될 수 있고 JavaScript 나 Python은 Function이 될 수 있다.

단위 테스트 케이스는 이상적으로 테스트 대상(=단위)이 의존하는 것에 대해 독립적(Independent)으로 작성 되어야 한다. 여기서 독립적이라는 것은 어떤 의미 일까? ‘실용주의 프로그래머’의 저자인 데이비드 토머스와 앤드류 헌트는 그들의 다른 책 ‘실용주의 프로그래머를 위한 단위 테스트 with JUnit’ 에서 ‘독립적’에 대해 아래와 같이 정의 한다.

Independent(독립적)

테스트는 깔끔함과 단정함을 유지해야 한다. 즉, 확실히 한 대강에 집중한 상태여야 하며, 환경과 다른 개발자들(명심하라. 다른 개발자들이 동시에 같은 테스트를 실행해 볼 수도 있다)에게서 독립적인 상태를 유지해야 한다.

또한 독립적이라는 것은 어떤 테스트도 다른 테스트에 의존하지 않는다는 것을 의미한다. 어느 순서로든, 어떤 개별 테스트라도 실행해 볼 수 있어야 한다. 처음 것을 실행할 때 그 밖의 다른 테스트에 의존해야 하는 상황을 원하지는 않을 것이다.

모든 테스트는 섬이어야 한다.

출처 : 실용주의 프로그래머를 위한 단위 테스트 with JUnit

독립적인 테스트 케이스를 작성 하기 위해서는 어떻게 해야 할까? 하나의 방법은 테스트 대상을 의존하는 것으로부터 격리(Isolation) 시키는 것이다. 프로그래밍 관점에서 격리 시킨다는 것은 테스트 대상이 의존하는 것을 실제가 아닌 다른 것으로 대체 하는 것이다. 이렇게 대체 하는 것을 Stub/Mock/Fake로 부른다.

Stub/Mock/Fake는 엄밀이 구분하면 조금씩 다르지만 대체 한다는 큰 의미에서는 같다고 할 수 있다. ‘xUnit 테스트 패턴’ 저자 제라드 메스자로스는 그의 책에서 Stub/ Mock/Fake 등을 묶어 ‘테스트 더블(Test Double)’이라고 정의 한다.

출처 : http://xunitpatterns.com/Test%20Double.html

영화에서 위험한 장면을 촬영할 때 진짜 배우 대신 대역 배우(Stunt double)를 쓰는 것처럼 ‘테스트 더블’의 더블(Double)이란 ‘대역’을 의미한다.


Yoo Young-mo

Written by

Developer at bettercode Co., Ltd.