유닛 테스팅이 무엇인지 이해하기 위해서는 유닛이 무엇인지부터 알아야 한다.
유닛이란 무엇인가?
유닛 테스팅의 유닛이란 독립적인(isolated) 기능을 저장하는 컨테이너로, 독립적인 기능을 담는 함수나 클래스 혹은 모듈 모두가 유닛이 될 수 있다. 하지만, 객체 지향 프로그래밍(Object Oriented Programming)에서 유닛은 조금 더 명확한 의미를 가진다. 객체 지향 프로그래밍에서 기능에 대한 책임은 객체에 있으며, 따라서 일반적으로 기능을 담는 객체가 유닛이 된다. 기능을 담는 객체가 유닛이 된다는 것은 기능을 담지 않는 객체는 유닛이 되지 않는다는 뜻이며, Kotlin에서의 data class 나 Java의 POJO 등은 유닛이 되지 못한다.
유닛이 무엇인지 알았으면, 이제 유닛 테스팅이 무엇인지 알아보자.
유닛 테스팅이란 무엇인가?
유닛 테스팅이란 유닛에 정의된 기능이 제대로 동작하는지 확인하는 작업을 뜻한다. 즉, 객체지향프로그래밍에서 유닛 테스팅이란 객체의 함수를 호출 했을 때 객체가 예상된 대로 동작하는지를 테스트 하는 것이다.
동작이 예상된 대로 확인하는 작업을 단언(Assert)라고 부르며, JUnit을 비롯한 다양한 테스트 프레임웍은 assertEquals, assertTrue 같은 단언들을 지원한다. 이러한 단언을 통해 테스트가 통과하는지 확인한다.
유닛 테스팅 실행해보기
유닛 테스팅이 어떻게 이루어지는지 살펴보기 위해 SimpleAdder 객체를 만들어보자. SimpleAdder 객체는 정수를 가변인자로 받아 모든 가변 인자에 대해 더하기를 실행하는 객체이다.
class SimpleAdder() {
fun add(vararg number: Int) : Int {
return number.sum()
}
}
이 객체가 제대로 동작하는지 확인하기 위해서는 3개의 인자가 입력되었을 때 더하기가 제대로 실행되는지 확인하는 방식으로 실행할 수 있다. 이러한 동작을 실행하는 테스트는 다음과 같이 작성된다.
class SimpleAdderTest {
@Test
fun `one plus two plus three is six`() {
// Given
val simpleAdder = SimpleAdder()
// When
val result = simpleAdder.add(1,2,3)
// Then
Assertions.assertEquals(6, result)
}
}
만약 이 테스트가 통과된다면 SimpleAdder 객체가 3개의 가변인자가 입력되었을 때 예상된대로 동작하는지 확인할 수 있다. 물론 테스트 케이스를 만드는 방법은 조금 더 복잡하다. 다양한 엣지 케이스들을 포함할 수 있도록 테스트 케이스를 만들고 테스트를 작성해야 한다. 하지만, 이 주제는 깊게 들어가면 너무 길어지므로 이에 대한 것은 별도 글에서 다루기로 한다.
정리
유닛 테스팅의 유닛이란 독립된 기능이며, 유닛 테스팅이란 이러한 기능에 대한 테스트를 진행하는 것이다. 객체 지향 프로그래밍에서 기능을 가진 것은 객체이므로, 객체가 가진 기능에 대한 테스트를 진행하는 방식으로 유닛 테스팅을 실행한다.