[TDD] Test Driven Development

강버섯·2022년 1월 5일
0

👉 TDD(Test Driven Devleopment)

TDD는 테스트 주도 개발을 의미한다.
단어 그대로 테스트가 주도하는 개발로, 테스트를 가장 중요한 것으로 생각하고 진행하는 개발 방식을 의미한다.
따라서, 프로그램 코드를 작성하기 전에 테스트 코드를 먼저 작성하는 방식으로 진행된다.

👉 테스트

  • 통합 테스트 : 외부 상황과 연동해서 하는 테스트
  • 단위 테스트 : 분리된 테스트
    -> 나누에서 진행할 시 테스트의 속도가 더 빨라질 수 있다.
    단위 테스트를 진행한 후 통합 테스트를 수행하는 순서로 진행된다.

✅ 장점

  • 동작하는 방식이 명확해지기 때문에 refactoring에 용이해진다.
  • 테스트 코드 자체가 프로그램에 대한 사용법 문서가 되기 때문에, 코드의 사용법이 명확해진다.
  • 기존의 코드가 수정 후에도 정상 동작하는지 확인할 수 있다.

✅ 단점

  • 작성해야할 코드가 많아진다.

👉 테스트 작성하기

테스트를 수월히 진행하기 위해서는 코드를 쪼개어 작성하는 것이 좋다.
코드가 하나의 역할만을 수행하도록하는 단일 책임의 원칙을 적용해서 구현할 수록 테스트 코드의 작성이 쉬워진다.

테스트 코드를 작성할 때에는 테스트 코드를 보고 해당 부분이 어떤 일을 수행하는지 명확하게 알 수 있도록 하는 것이 좋다.

테스트 코드는 "일어나기를 바라는 것들" 을 적어주면 된다.
즉, 코드가 작동하기를 원하는 희망 사항을 적는 것이다.

👉 클린 아키텍처를 적용한 테스트 코드 작성

클린 아키텍처는 테스트에 용이한 구조를 가진다.
따라서, TDD를 진행할 때의 아키텍처 구조로 클린 아키텍처를 적용하여 진행해보았다.클린 아키텍처에서 중요한 부분은 각 계층의 경계 부분이다.
따라서 경계를 넘나드는 부분은 모두 테스트 코드가 필요하다고 생각하면 된다.
클린 아키텍처에서 바깥 계층일수록 언제든 바뀔 수 있는 것으로 취급되기 때문에, 아키텍처의 내부부터 테스트를 작성하는 것이 더 쉽다.

✅ 코드를 작성할 부분

1. 경계
클린 아키텍처에서 각 경계를 넘나들 때에는 객체를 생성하여 데이터를 이동시킨다.
생성되는 객체는,

  • Entity 계층의 객체
  • DB에서 받아오는 객체
  • Use Case에서 사용하는 객체(Request Object)
  • 사용자에게 받아오는/반환하는 객체

가 존재한다.

클린 아키텍처에서는 이 경계 부분이 가장 중요하기 때문에 경계를 넘나드는 데이터의 validation이 중요하다.
이 데이터는 생성되는 factory 함수에서 진행하도록 하면 된다.
데이터가 생성될 때 확실히 검증이 이루어져 유효한 데이터가 생성이 된다면, 데이터를 받는 계층에서는 데이터의 유효성 여부에 대한 로직은 생각하지 않아도 되는 편리함이 생긴다.
(validation - data의 형식이 맞는 가에 대한 검증)

외부로부터 데이터를 받는 controller 부분에서 use case로 넘어갈 때 생성되는 request object의 factory 함수에서 validation을 진행한다면, 내부 계층에서는 데이터의 유효성에 대해서는 신경쓰지 않아도 된다.

2. 계층

계층은 서로 분리해서 테스트를 진행하도록 한다.
될 수 있다면 아키텍처의 원 범위 내에서 테스트를 진행하는 것이 좋다.

Mock을 사용한다면 계층 간의 연결 관계를 신경쓰지 않고 테스트를 진행할 수 있다.
Mocking data를 통해서 다른 계층의 return 값을 명시하면 타 계층이 구현되어있지 않더라도 원하는 계층의 구현이 가능하다.
다만 각 계층의 return 값은 알아야하기 때문에, 명세 정도는 알고 있는 것이 좋다.

계층을 분리해서 테스트를 진행하면

  1. 계층에 역할에 집중할 수 있고
  2. 각 경계에 대해서만 집중하면

되기 때문에 훨씬 수월히 개발을 진행할 수 있다.
계층에서의 테스트를 진행하게 된다면, 코드를 구현할 때 해당 계층이 어떤 데이터를 받아서 어떤 일을 처리하는가에만 집중하면 되는 것이다.

이렇게 테스트를 진행해서 프로그램을 구현해나간다면,

  • 코드의 재사용이 가능
  • 변경이 일어나도 테스트를 통해서 정상 동작 여부 확인 가능
  • DB등의 인터페이스가 정해지지 않아도 개발 가능
  • 인터페이스의 변경이 일어나도 다른 계층은 정상 동작

등의 장점을 얻을 수 있다.

profile
무럭무럭 버섯농장

0개의 댓글