우아한 테크캠프 Pro — 5주차

Byungkyu Ju
byungkyu-ju
Published in
4 min readFeb 1, 2021

5주차 — 인수 테스트 기반 TDD

5주차 강의

5주차 강의는 4주차의 ATDD에서 조금 더 리팩토링하는 과제였다.
지난주는 API를 검증하는 용도에 포커스였다면, 이번에는 시나리오를 세우고, 흐름을 검증하는 형태로 리팩토링을 진행하였다.

강의가 시작되기 전, mockito와 stubbing을 활용해서 객체를 mock으로 생성하고 예상되는 결과를 작성하는 형태로 라이브코딩을 볼 수 있었다.

그리고 외부 라이브러리가 제공되었을 경우, 라이브러리 자체를 검증하는 형태가 아닌 라이브러리를 사용하는 부분에 대하여 검증하는 식으로 테스트를 작성하는 방법을 볼 수 있었다.

Outside-In TDD

http://creativejubilee.com/project-management-blog/inside-out-outside-in-approach-to-marketing/

TDD의 방식은 Inside-Out방식과 Outside-In 방식이 있다고 한다.
이때까지 해왔던 전통적인 방법은 Inside-Out방식으로, 객체와의 관계를 고려하지않고 개발을 시작해서 객체 내부의 기능부터 구현해 나가는 방식으로 구현을 했었다.

하지만 이번에 알게된 Outside-In 방식은 인터페이스를 먼저 구현하고, 사용할 레이어를 mocking하여 DB나 기타 의존성의 영향을 제거한 후 테스트를 구현해 나가는 방식으로 TDD를 작성해 나가는 방법이었다.

Outside-In 방식으로 구현했을때 느낀점은 실제 Service layer나 repository부분조차 없다는 전제로 mocking하면서 개발을 했기 때문에 거시적인 관점에서 내부로 접근한다는 느낌을 받을 수 있었다.

로그인에 기반한 인증테스트도 구현할 수 있었는데, 토큰발급과 같은 oAuth의 기능을 연동할 경우 테스트구현을 어떻게 하는지 궁금했었다.
막상 제공되는 과제내용을 유추해가며 기능을 구현해보니 자연스럽게 이전과 같이 기능을 구현하게 되었고, 외부 라이브러리와는 상관 없이 객체 자체만으로 테스트를 구현해야 한다는 점을 더 기억하게 되었다.

이번 과제도 ATDD에 대한 피드백보다는 객체 자체의 기능구현에 대해 수정요청을 받은 부분이 많았다. TDD 사이클에 익숙해지려고 흐름에 집중하다보니 객체에게 행위를 위임하는 기본적인 부분을 놓치게 되는 경우가 종종 발생했다. 리팩토링과정을 여러번 반복하는 것이 필요한데, 빨리 과제를 제출하고싶다는 마음에 누락되는 부분이 많았던것같다.

code: https://github.com/byungkyu-ju/atdd-subway-service
PR #1: https://github.com/next-step/atdd-subway-service/pull/60
PR #2: https://github.com/next-step/atdd-subway-service/pull/86
PR #3: https://github.com/next-step/atdd-subway-service/pull/103
PR #4: https://github.com/next-step/atdd-subway-service/pull/109

--

--