[CowAPI] 2. TDD

준돌·2022년 5월 26일
0

오늘의 Cow

목록 보기
2/45
post-thumbnail

1. TDD 란?


  • Test Driven Development의 약자입니다.
  • Agile 방법론 중 하나인 XP의 "Test-First" 개념 기반입니다.
  • 테스트 케이스를 작성하고 통과하는 코드를 추가하고 수정하는 것을 반복하여 구현합니다.

2. TDD를 사용하는 이유


" 급변하는 세상을 살아가며 제품을 만들어가는 입장에서 빠른 개발에만 집중하여 일단 만들고 다시 들여다 보기 두려운 제품을 만들어 하루하루 살얼음판을 걸을지, 아니면 초반 스피드는 다소 늦더라도 빠르게 변화에 대응해가며 안정적인 제품을 만들어 갈 것인지."
"선택은 자유다."
by Product Manager 관점에서 바라 본 TDD


3. TDD 흐름


  1. 기능을 구현한 구현 코드가 아닌 테스트 코드를 먼저 작성합니다.

  2. 테스트 코드만 작성된 시점에는 구현 코드가 없으므로 컴파일 오류가 발생합니다. 컴파일 오류 해결하기 위한 최소한의 구현 코드를 작성합니다.

  3. 테스트 코드를 실행하면 로직으로 구현된 내용이 없으므로 테스트 코드는 통과하지 못합니다.

  4. 테스트 코드가 통과될 때까지 구현하는 것을 반복합니다.

  5. 🔑 하지만, 구현에서만 멈추면 TDD를 수행한 것이라고 볼 수 없습니다. 왜냐하면 실패(Fail) — 성공(Success) — 리팩토링(Refactoring)의 흐름을 통해 “동작하는 클린 코드” 를 얻는 것이 TDD의 궁극적인 목표이기 때문입니다.

  6. 테스트 통과만을 위해 작성한 구현 코드를 리팩토링 하면서 클린 코드를 만들어갑니다.

  7. 마지막으로 테스트 코드를 리펙토링합니다.


4. TDD (Given/When/Then)


  • 요즘 단위테스트는 주로 "Given/When/Then" 패턴으로 작성하는 추세입니다.

  • Given : 어떤 데이터가 준비되었을 때

  • When : 어떤 함수를 실행하면

  • Then : 어떤 결과가 나와야한다.

@Test
@DisplayName("유저 회원가입 테스트")
void userSigninTest() {    
	// given
    
	// when   
    
	// then
    
}

@Test

  • test method라는 것을 알려주는 어노테이션입니다.
  • method는 private or static을 사용할 수 없으며 return 값을 갖지 않습니다.
  • ParameterResolvers를 통해 parameters를 줄 수 있습니다. 코드예제입니다.
  • 어노테이션을 생성할 때, 상속할 수 있습니다.
  • 그리고 순서에 의존하지 않고 테스트를 진행합니다.

@DisplayName

  • 테스트 클래스나 테스트 메소드에 어노테이션 하여 custom display name을 선언하기 위해 사용합니다.
  • 일반적으로 IDE 및 빌드 도구에서 사용되고 공백, 특수 문자, 이모티콘을 사용할 수 있습니다.

5. CowAPI 에서의 TDD


  • CowAPI 개인 토이 프로젝트를 진행하며 TDD 방식을 적용해보았습니다.

  • 안정적으로 테스트를 진행하고 구현하기 위해 기능별로 "Domain -> Service -> Controller" 순으로 테스트 코드를 작성하고 구현하여 테스트를 진행했습니다.

  • 처음에는 테스트 코드를 작성하며 개발하는 시간이 많이 걸렸습니다. 하지만, 테스트 코드를 작성하는데 익숙해지기 시작했고 구현한 코드가 원하는 동작을 제대로 하는지 확인할 수 있고 안정적으로 코드를 수정할 수 있다는 장점을 직접 느끼기 시작했습니다.

  • 올바르고 더 좋은 테스트 코드는 어떤 것인가?를 학습하며 수정하고 있습니다.

  • 또한, 반복되는 CRUD 테스트 코드를 어떻게 하면 더 손쉽게 작성하고 실행시킬 수 있을지에 대한 고민중입니다.


6. Test Code


  • 각 기능에 대한 테스트 코드는 Github에서 확인하실 수 있습니다.
  • Github : CowAPI

7. 코드 리뷰


profile
눈 내리는 겨울이 좋아!

0개의 댓글