테스트 주도 개발 시작하기, 2장 TDD 시작

60jong·2023년 5월 24일
0

Test

목록 보기
2/2
post-thumbnail

나의 테스트 코드

여태 TDD, Test Driven Development라는 말을 많이 접했다. TDD란 말을 많이 접했음에도 이제서야 제대로 TDD를 학습하기 시작한다는 것은, TDD에 대한 중요성을 크게 느끼지 못했기 때문이다.

여태 "테스트? 당연히 중요하지. 개발한 다음에 이를 테스트하는 것으로도 충분하지."라는 생각으로 개발한 코드에 대해 단위 테스트만을 진행해왔다.

그동안은 온갖 mock을 사용하며 어찌어찌 테스트를 진행했다. 하지만 점점 나의 테스트에 의문점이 들었다.

  • 테스트 코드를 짜는 과정에서 이 메서드는 문제가 없어라는 전제 아래에서 테스트를 짜고 있었다.

    • 이 전제가 굉장히 무서운게, 문제 없는 메서드 -> 굳이 테스트를?이라는 생각으로 이어졌고, 테스트를 짜는 것을 생략하는 경우가 생겼다.
  • 이로 인해 단순한 케이스에 대한 테스트만을 진행했고, 설계와 리팩터링을 고민할 시간을 따로 내야만 했다. -> 설계와 리팩터링 고민하는 시간이 줄음

하지만

설계에 대한 고민이 부족한 상태로 개발이 계속 진행됐기에, 아래와 같은 문제 상황들을 맞이할 수밖에 없었다.

  1. 테스트하기 어려운 상황
  2. 고려되지 않았던 예외 상황의 발생으로 전체적인 설계 수정

1의 경우에는 메서드의 멱등성을 기반으로 수정하면 어찌어찌 테스트하기 쉽게 바뀌기도 했다.

그러나 2의 경우는 한 예외 상황을 추가함으로써 연쇄적인 컴파일 에러를 해결해야만 했다. 이로인해 자연스레 개발이 느려지게 됐다.

결국

위 문제 상황들이 반복되면서, 이런 생각이 들었다.

"어차피 테스트 짜야하는거, TDD를 이용하면 개발을 하고나서 바로 다음으로 넘어갈 수 있으니 차라리 좋은데?" 란 생각이 들었고, 지속적인 설계, 리팩터링에 대한 고민을 할 수 있으니 좋다는 생각이 들었다.

TDD를 배워보자!!

TDD의 절차

저자 또한 나와 같은 개발 프로세스를 가졌었다가 TDD를 적용하였다.

저자가 소개하는 TDD의 절차는 다음과 같다.

테스트 > 코딩 > 리팩터링 > 테스트 > ...

조금 더 자세하게 정리하자면

1. 클래스 생성 없이 원하는 클래스, 메서드로 테스트 상황을 만든다.

처음 테스트를 만들 때에는, !!클래스 생성없이!! 원하는 테스트 상황을 만든다.

@Test
void plus() {
	int result = Calculator.plus(1,2);
	assertEquals(3, result);
}

이때 3가지 고민이 수반된다.

  • 클래스 명
  • 메서드 명
  • static 메서드 vs instance 메서드 -------(이 부분은 아직 기준을 잘 모르겠다.)

2. 이를 통과시키는 코드를 만든다.

위 테스트는 바로 컴파일 에러가 난다. 클래스를 만들지 않았기에

고로 Calculator 클래스와 plus 메서드를 만들어 저 상황을 만족하게 코딩하자

public class Calculator {
	public static int plus(int n1, int n2) {
		return 3;
    }
}

위 코드처럼 정말 단순하게 개발을 점진시키는 것이 포인트!!!
(바로 return n1 + n2)해도 될 것 같긴 하다.

3. 다른 케이스도 통과하는지 check, if not -> return to 2

2를 거쳐 테스트는 통과할 것이다. 그러면 다른 상황도 해보자.

@Test
void plus() {
	int result = Calculator.plus(1,2);
    int result2 = Calculator.plus(1,4);
	assertEquals(3, result);
    assertEquals(5, result);
}

테스트를 돌려보면 실패하게 된다. 따라서 result2도 만족하도록 코딩하자.

public class Calculator {
	public static int plus(int n1, int n2) {
		return n1 + n2;
    }
}

4. 리팩터링

자 이제 모든 케이스를 통과하는 코드를 만들었다. (물론 validation도 필요)

지금 plus()는 간단하지만 복잡한 코드의 경우, 지속적인 리팩터링이 가능하다.

왜냐하면

테스트를 통과시키도록 코드를 수정해야 하기에 코드를 계속 들여다보게 되기에!!


이러한 과정을 거쳐 완성된 클래스를 그제서야 src/java/~~ 패키지로 옮기게 된다.

정리

  1. 클래스 생성 없이 원하는 테스트 상황을 만든다.

  2. 이를 통과시키도록 개발한다.

  3. 추가적인 상황을 체크해 2로 돌아가기를 반복한다.

  4. 개발된 코드를 리팩터링한다.

  5. 개발이 완료된 클래스를 이제서야 java 패키지로 옮긴다.

profile
울릉도에 별장 짓고 싶다

0개의 댓글