[TDD] 단위 테스트와 TDD(테스트 주도 개발) -(1/5)

윤재열·2022년 4월 30일
0

Spring

목록 보기
54/72

TDD가 중요하다는 말을 너무 많이들어서 이번 포스팅에서는 단위 테스트와 중요성 그리고 단위 테스트를 바탕으로 하는 TDD는 어떻게 프로그래밍하는 것인지 배워보도록하겠습니다.

1. 단위 테스트의 중요성과 좋은 단위 테스트의 특징

[단위 테스트(Unit Test)를 작성해야 하는 이유]

  • 코드를 수정하거나 기능을 추가할 때 수시로 빠르게 검증 할 수 있다.
  • 리팩토링 시에 안전성을 확보할 수 있다.
  • 개발 및 테스팅에 대한 시간과 비용을 절감할 수 있다.

테스트 코드를 작성하면 우리가 개발한 코드들에 대해 수시로 빠르게 검증을 받을 수있으며, 기능을 수정하거나 리팩토링을 할 때에도 검증을 받으므로 안정성을 확보 할 수 있다는 장점이 있습니다.

하지만 그것보다 큰 장점으로 개발 및 테스팅에 대한 시간과 비용을 절감할 수 있습니다.

우리는 개발이 끝난 뒤에 문제가 없는지 확인하기 위해 애플리케이션을 실행하고, 직접 수동 테스트를 진행해야합니다.
단위 테스트를 작성하지 않은 코드들은 테스트를 작성하지 않은 코드들 보다 버그가 잠재되어 있을 확률이 높은데, 문제는 직접 테스트 하는 비용이 너무 크다는 것입니다.
그 이유는 통합 테스트를 위해서는 캐시, 데이터베이스 등 외부 컴포넌트들과 연결 등 부가적인 시간이 필요하기 때문입니다.
테스트 코드를 작성하지 않았다면 여러 개의 버그가 잠재되어 있을 확률이 있고, 모든 버그들을 수정하고 테스트를 반복하는 비용은 기하급수적으로 늘어나게 됩니다.
그러므로 우리는 개발 및 테스팅에 대한 비용을 줄이기 위해 단위 테스트를 작성해야 합니다.

좋은 테스트의 특징

  • 좋은 테스트의 특징은 FIRST라는 5가지 규칙을 따라야 합니다.
  1. Fast : 테스트는 빠르게 동작하여 자주 돌릴 수 있어야 합니다.

  2. Independent : 각각의 테스트는 독립적이며 서로 의존해서는 안됩니다.

  3. Repeatable : 어느 환경에서도 반복 가능해야 합니다.

  4. Self-Validating : 테스트는 성공 또는 실패로 boolean 값으로 결과를 내어 자체적으로 검증되어야 합니다.

  5. Timely : 테스트는 적시에 즉 , 테스트하려는 실제 코드를 구현하기 직전에 구현해야 합니다.

    정리하자면, 위의 내용을 압축하여 정리하면 좋은 테스트는 빠르게 독립적으로 어느 환경에서든 실행이 가능하고 검증할 수 있어야 한다는 것입니다.
    그리고 위의 5가지 규칙 중에서 Timely에 주목해야할 필요가 있습니다.
    테스트 코드를 작성하는 시점에 대한 이야기인데, CleanCode에서는 테스트 코드를 실제 코드를 구현하기 직전에 구현하라고 설명되어 있습니다.

2.TDD(테스트 주도 개발),테스트 코드를 먼저 작성해야 하는 이유와 방법 및 순서

[테스트 코드를 먼저 작성해야 하는 이유]

테스트 코드를 먼저 작성하는 개발 방법론은 테스트 주도 개발(Test-Driven Development,TDD)로 많이 불립니다.
우리는 프로덕션 코드 보다 테스트를 먼저 작성해야 하는데, 그 이유는 다음과 같다.

테스트 주도 개발(TDD, Test-Driven Development)의 궁극적인 목표는 작동하는 깔끔한 코드를 작성하는 것입니다.
이 리팩토링 과정을 거치면서 중복된 코드들은 제거되고,복잡한 코드들은 깔끔하게 정리하게 됩니다.

또한 테스트를 처음 작성할 때에는 귀찮고 개발을 느리게 한다는 느낌을 받을 수 있지만, 장기적으로 보면 반드시 개발 비용을 아껴줄 것입니다.

마지막으로는 현실적인 이야기인데, 프로덕션 코드를 먼저 작성하였다면 이후에 테스트 코드를 작성하는 과정은 너무 귀찮습니다.
왜냐하면 테스트 코드는 성공 케이스 뿐만 아니라 실패 케이스까지 작성해야 해야 하기 때문에 작성해야 할 테스트의 개수는 해당 함수에서 발생가능한 모든 경우들인 N이며, 이미 개발이 완료되었기에 심리적 요인 때문에 테스트를 작성하는 것이 꺼려지기 때문입니다.

그리고 그 중에서도 실패 테스트부터 작성해야합니다. 즉, 순차적으로 실패하는 테스트를 먼저 작성하고, 오직 테스트가 실패할 경우에만 새로운 코드를 작성해야 합니다. 그리고 중복된 코드가 있으면 제거 하는 것입니다.

TDD(Test-Driven Development,테스트 주도 개발) 프로그래밍 방법 및 순서

TDD 개발 방법론의 프로그래밍 순서를 매우 단순하다.

  1. 실패하는 작은 단위 테스트를 작성한다. 처음에는 컴파일조차 되지 않을 수 있습니다.
  2. 빨리 테스트를 통과하기 위해 프로덕션 코드를 작성해야 합니다. 이를 위해 정답이 아닌 가짜 구현등을 작성할 수 있습니다.
  3. 그 다음의 테스트 코드를 작성합니다. 실패 테스트가 없을 경우에만 성공 테스트를 작성합니다.
  4. 새로운 테스트를 통과하기 위해 프로덕션 코드를 추가 또는 수정합니다.
  5. 1~4단계를 반복하여 실패/성공의 모든 테스트 케이스를 작성한다.
  6. 개발된 코드들에 대해 모든 중복을 제거하며 리팩토링합니다.

위의 과정을 따라 개발을 진행하면 자연스럽게 프로덕션 코드보다 테스트 코드를 먼저 작성하게 될 것이다.

3. Spring에서의 TDD 프로그래밍 방법

  • Repository -> Service -> Controller 순서로 개발을 진행합니다.
  • Repository 계층의 테스트는 H2 와 같은 인메모리 데이터 베이스 기반의 통합 테스트로 진행됩니다.
  • Service 계층의 테스트는 Mockito를 사용해 Repository 계층을 Mock하여 진행합니다.
  • Controller 계층의 테스트는 SpringTest의 MockMvc를 사용해 진행한다.

왜냐하면, Repository 계층은 다른 계층에 대한 의존성이 거의 없기 때문에 먼저 작성하기 편리하기 때문입니다. Service 계층은 Repository에 의존하기 때문에 Repository가 있으면 편리하며 흐름이 끊기지 않고, Controller 계층은 마찬가지로 Service계층에 의존하기 때문입니다.

profile
블로그 이전합니다! https://jyyoun1022.tistory.com/

0개의 댓글