멋사 Backend 63일차 🦁

신재원·2023년 7월 20일

❓ TDD

🔎 TDD의 의미

일반적인 개발 흐름

  1. 요구사항에 대한 설계
  2. 실행 코드 개발
  3. 테스트 코드 작성 일반적으로 위와 같은 순서로 개발하게 됩니다.

TDD 란 ?

➡ 테스트 코드가 주도하여 개발을 이끌어 나가는 것입니다.

TDD (Test Driven Development) 의 약자이며, 하나의 방법론 입니다.
1. 요구사항에 대한 테스트 코드를 먼저 작성합니다.
(요구사항에 대한 테스트 코드를 먼저 작성하면, 요구사항을 면밀히 분석 할수 있다.)
2. 테스트 코드를 통과하는 실행 코드를 작성합니다.
3. 통과한 코드의 품질을 향상 시킵니다. (리펙터링)
4. 테스트 코드를 기반으로 설계를 수정 합니다.

아래은 TDD의 레드 그린 사이클 입니다.

  • RED 단계 : 항상 실패하는 테스트 코드를 작성합니다.
  • GREEN 단계 : 테스트 코드가 통과하는 실행 코드를 작성합니다.
  • Refactor 단계 : 테스트 코드가 통과 되면 실행 코드의 성능을 개선시킵니다.

🙋‍♂️ TDD 예시

  • 아래의 사진은 더하기 테스트 코드 입니다.
    • 테스트 코드를 보면 Calculator 라는 객체와 add에 대한 메소드가 존재하지 않아 실패하는 테스트 코드입니다.
      (TDD 방법론은 실패하는 테스트 코드를 먼저 작성)
  • Calculaotr 객체와 add 메소드를 생성해 테스트 코드가 통과되게 만들어 줍니다.
  • 이때 return a + b 를 하지않은 이유는 테스트가 통과할수 있는 최소한의 로직을 작성해야 점진적으로 코드를 발전해 나갈수 있습니다.

🙋‍♂️ TDD Mock 예시

  • @DataJpaTest 란 ?

오직 JPA 테스트를 위한 어노테이션 입니다.
( 기본 전략으로 in-memory-db (H2 DB) 를 사용합니다.)

  • ArticleRepositoryRepository 클래스가 잘 작동하는지 테스트 합니다.
  • Mock 테스트 란 ?

테스트 하려는 코드가 의존하는 객체를 가짜로 만들어 줌으로써 의존성을 제거하고, 객체의 동작을 통제 할수 있습니다.

가짜 객체가 필요한 이유는 B 라는 객체의 add() 메서드를 테스트 하고 싶다.
그런데 B 인스턴스를 생성하기 위해서는 A 라는 인스턴스를 B의 생성자 매개변수로 넘겨주어야 한다.
즉, B가 A에 의존하고 있는 것을 알 수 있다.
➡ 이러한 의존성을 제거하기위해 mock 이라는 가짜 객체를 사용합니다.

이부분은 많은 연습이 필요할것같다

🧩 테스트 프레임 워크

  1. Junit 5 : 스프링 부트에 내장되어 있는 테스트 프레임 워크 입니다.
  2. Mock : 가짜 객체인 mock 객체를 생성하며, 관리합니다.
  3. AssertJ : 참 / 거짓 논리값을 판별하기 위해 사용합니다.

정리

  • 조직의 상황에 맞게 TDD 방법론을 도입을 하게됩니다.

➡ 장점 : 지속적인 리펙토링을 통해 코드의 품질을 향상 시킬수 있으며, 유지 보수 비용이 줄어듭니다.

➡ 단점 : 동작하지 않는 코드를 작성해야 한다는 거부감, 초기 단계에서의 테스트 작성시 많은 시간을 소모 할수 있습니다.

Reference

https://emgc.tistory.com/143
https://beststar-1.tistory.com/30

1개의 댓글

comment-user-thumbnail
2023년 7월 20일

가치 있는 정보 공유해주셔서 감사합니다.

답글 달기