🧐 현재 상황
네이버 부스트 캠프에서 Test코드를 꾸준히 작성하는 습관을 기르고 있는데, 코드를 리팩토링 할 때 정말 놀라운 경험을 할 수 있었다. 결국 리팩토링을 하더라도 기존의 요구사항과 똑같은 기능을 가지고 있어야 하는데, 테스트 코드를 작성하고 리팩토링 하다 보니 놓친 기능들도 확인할 수 있었고, 내가 리팩토링 한 것들이 잘 작동하는지도 즉각 즉각 확인해 볼 수 있었다. 그래서 이번에 테스트 주도 개발을 해보기로 했다!
도대체 TDD를 어떻게 해야 할까? 테스트 코드부터 작성한다!라는 개념만 알고 있었지만 막상 TDD 개발을 하려니 어떻게 해야 할지에 대한 감이 잡히지 않았다.
🥸 학습 과정
TDD
IBM에서 작성한... 무려 최최최신자료인 24년 7월에 작성한 글이 있었다. 5가지 간단한 스탭을 소개하는데 가장 이해가 쉽고, 적용하기 좋아 보였다. 이 방법을 사용해 보기로 했다. 아래의 방법이 Red-Green-Refactoring Cycle이라는 유명한 TDD 방법이라고 한다. 또한 카카오 페이에서 작성한 좋은 글도 있었다.
요약하자면 기능 파악 → 테스트 코드 → 실패 → 코드 작성 → 통과 → 코드 리팩토링 → 반복의 과정을 겪는 것이다. 그렇다면 바로 TDD 개발에 들어가보자.
테스트하지 말아야 할 것
테스트해야 할 것은 너무너무 많지만 테스트하지 말아야 할 것이 상대적으로 적은 것 같아서 나름 공부하면서 정리해 보았다.
- 라이브러리, 프레임워크 내부 동작
- 랜덤 값, 네트워크 등 로직이 아닌 결괏값이 실패할 가능성이 있는 코드
- UI 레이아웃
- 정적인 데이터(상수)나 인스턴스 그 자체
- 내부구현 세부사항 → 너무 디테일한 세부사항은 오히려 리팩토링 시 독이 될 수도 있다고 한다.
AAA 테스트 패턴
AAA 테스트 패턴은 Arrange, Act, Assert 테스트 패턴이다. 번역하자면 준비, 실행, 검증 단계라고 할 수 있다. XCTest가 XCTAssert~ 형식을 띠고 있기 때문에 AAA 패턴이 네이밍이 비슷해서 가장 끌렸다.
func test_예시() {
// Arrange 준비
let sut = SUT()
// Act 실행
let result = sut.foo()
// Assert 검증
XCTAssertEqual(result, true)
}
Private Method의 테스트
Private Method는 어떻게 테스트해야 할까? 테스트 코드를 작성하면서 가장 고민되었던 부분이었던 것 같다. 접근 제어자를 바꾸는 극단적인 방법을... 택했었는데, 사실 Private Method 자체가 Public Method 안에 포함되어 있기 때문에 그 Public Method 의 테스트 만으로도 충분하다는 것이었고, TDD를 진행하게 된다면 결국 리팩토링 과정에서 만들어지는 것이 Private Method 이기 때문에 TDD 방법으로 개발을 하게 된다면 이 문제가 자연스럽게 해결된다는 말이 있었다. (직접 겪어보고 싶다)
🧑🏻💻 개발 과정
앱에 필요한 기능이 무엇일까부터 생각해 봤다. 가장 먼저 생각나는 것은 포인트 시스템! 애자일(?)하게 가자~ 라는 느낌으로 바로 이슈를 만들고 작업을 진행했다.
무작정 Test파일과 Swift파일 생성해 주었다.
Snippet을 만들어두면 편하다.
너무나도 간단한 기능이지만 무작정 테스트 작성 후 실패!
아주아주 간단하게 Calculator를 만들고 테스트 성공!
리팩토링 할 필요가 없을 정도로 초 간단한 기능이기 때문에 우선 첫 번째 기능은 이렇게 마무리! 테스트 성공이라고 뜨니까 예상대로 동작해서 소소한 성취감(?)이 있다. 앞으로도 계속 TDD 방식으로 개발을 진행할 예정이다.
'→ Guesser' 카테고리의 다른 글
[Project-Guesser] Xcode에서 API Key 완벽하게 숨기기 (Git Hook) (2) | 2024.09.17 |
---|---|
[Project-Guesser] 프로젝트 시작 (0) | 2024.09.15 |