티스토리 뷰

개발노트/ 안드로이드

[안드로이드] TDD란 ?

상 후 니 2022. 1. 11. 10:23
반응형

"NEXTSTEP"이라는 온라인 수업으로 "이펙티브 코틀린 with TDD, Refactoring, Clean Code" 강의를 들었다.

그중 현업에서 자주 들어 봤지만 잘 이해하지 못했던 TDD에 대한 정리를 하려고 한다.

 

TDD?

TDD란 Test-Driven-Development의 약자로 해석하면 '테스트 주도 개발'이라고 한다.

일종의 개발 방법론으로써 흔히 사용하는 개발 방법과 다른 프로세스를 가진다.

 

기존 프로세스: 개발 -> 테스트

TDD 프로세스: 테스트 코드 작성 -> 개발 -> 리팩터링

 

이렇게만 들으면 머릿속으로는 이해해도 사용하기 쉽지 않을 것이다.(내가 딱 그랬다)

한번 사용해 보자

 

Example

문자열 계산기의 덧셈 기능을 만든다고 가정해보자 예를 들어 "2+2"를 넣는다면 4가 나와야 한다.

일반적으로는 이렇게 시작할 것이다.(아마도)

// None using TDD
class Calculator() {
    fun add(input: String): Int {
        val numbers = input.split("+")
        return numbers.map {
            it.toInt()
        }.sum()
    }
}

기능을 먼저 만든 후 main함수에서 "2+2", "1+2+3" 등 여러 값을 넣어서 테스트해보고 올바르게 나오는지를 확일할 것이다.

하지만 TDD 방식은 기능을 먼저 구현하지 않는다.

// Using TDD
class CalculatorTest {
    @Test
    fun `덧셈 테스트`() {
        assertEquals(Calculator().add("2+2"), 4)
    }
 }

덧셈 기능을 테스트해주는 함수를 먼저 작성한다.(junit을 사용한 Unit Test를 먼저 알고 있어야 한다)

그럼 여기서 한 가지 의문이 든다. 난 아직 Calculator 클래스를 만들지 않았는데 어떻게 사용하지?

맞다 Calculator 클래스를 찾을 수 없어서 빨갛게 나올 것이다.

이 상태에서 테스트 코드가 참조할 수 있도록 클래스와 함수를 만들어준다. 그러면 Calculator 클래스를 참조할 수 있게 된다.

이제 테스트 코드를 실행을 시켜본다. 어떻게 될까??? 

당연히 실패할 것이다.(기능 내부를 구현을 하지 않았으니..)

실패

4를 기대했지만 함수는 0을 리턴해주고 있기 때문에 실패로 발생한다 그럼 리턴 값을 4로 변경하고 다시 테스트 코드를 실행시켜보자

성공

테스트가 성공하여 초록색으로 누가 봐도 성공 표시가 뜬다. 하지만 이것도 잘못되었다 테스트 코드의 input 값을 다른 문자열로 변경하면  실패로 바뀔 것이다. 이제 Calculator 내부의 함수를 구현을 하는 것이다.

 

위에 진행했던 과정이 

1. 실패(레드)

2. 성공(그린)

3. 리팩터링

의 과정을 거친 것이다.

 

즉 TDD의 핵심은 테스트 코드를 먼저 작성하고 해당 테스트 코드를 통과하기 위한 코드를 작성하는 것이다.

 

느낀 점

1. 개발 시간이 더 오래 걸렸다. 어떤 걸 테스트해야 하는지에 대한 고민이 오래 걸렸다. 도메인 지식이 부족할수록 더 걸렸다.

2. 오래 걸린 만큼 퀄리티 있는 코드를 작성할 수 있었다. 테스트를 하기 위해 작성을 하니 책임을 좀 더 세분화하게 나눌 수 있었다.

3. 무조건 좋다는 생각이 들지는 않았다. 각자 더 취향에 맞는 개발 방법을 선택하면 될 것 같다.

반응형
댓글