Ios tdd cover

iOS에서 TDD(Test-Driven Development)하기

저는 92년생 학생으로 I/O라는 회사에서 1년 넘게 iOS를 개발하고 있습니다. 현재 Switcher라는 앱을 개발하고 있습니다. 오늘은 TDD가 뭔지, 왜 해야 하는지와 제 TDD 경험을 말씀드리고 Xcode에서 iOS TDD하는 법에 대해 말씀드리겠습니다.


TDD

TDD란 Test-Driven Development로 테스트 주도 개발이라는 개발 방법론입니다.

단계

ios-tdd-three-laws

TDD는 실패하는 테스트를 작성하고(red), 작성된 테스트를 통과하는 코드를 작성한 후(green), 작성한 코드를 리팩토링하는(refactor) 세 단계를 거칩니다.

이런 개발 뉴스를 더 만나보세요

ios-tdd-failing-test

처음에는 실패하는 테스트를 작성합니다. addtion이라는 함수를 일단 작성하고, 이를 테스트하는 함수를 실패하도록 작성합니다.

ios-tdd-passing-test

이제 성공하는 테스트를 작성합니다.

ios-tdd-refactoring

그다음 변수 네이밍을 바꾸거나 중복 제거를 하는 등 리팩토링을 합니다.

ios-tdd-passing-test2 ios-tdd-failing-test-2

다시 실패하는 테스트를 작성하고, 다시 성공하는 테스트를 작성합니다. 이로써 코드 작성이 완료됐습니다.

장점

소스코드 품질이 향상되고, 필요한 코드만 작성하므로 사용하지 않는 코드를 짜지 않게 됩니다. 테스트를 통과한 코드만 존재하므로 디버깅 시간도 절약됩니다. 모듈화 디자인, 유지보수 용이성, 리팩토링 용이성과 테스트 코드 문서화라는 장점도 있습니다. 그리고 제가 가장 중요하게 생각하는 TDD의 장점은 자신감 을 가질 수 있다는 점입니다.

단점

단점은 프로토타이핑을 빠른 시간 안에 마치고 결과를 보여줘야 하는 상황에는 부적합하며, 익숙해지는데 시간이 걸린다는 점입니다.

TDD Rule

TDD에는 세 가지 룰이 있는데 GIVEN, WHEN, THEN입니다. 테스트를 시작하기 위해 주어지는 전제를 GIVEN이라고 하고, 테스트하는 코드가 주는 결과를 WHEN, assertion을 THEN이라고 합니다.

WHT TDD?

이제 왜 TDD를 사용해야 하는지에 대한 제 생각을 공유하겠습니다. 저는 삶의 지혜를 개발에도 사용할 수 있다고 생각하는데요. 아는 길도 물어보고 가라는 속담처럼 어떤 코드를 짜고 싶은지 개발자는 바로 알고 있지만, 이것을 검증하는 것이 필요합니다. 이런 TDD라는 지혜는 실수를 줄이기 위한 삶의 지혜가 될 것으로 생각합니다.

또한 칼 포퍼가 말한 반증 가능성에 따라 많은 테스트를 견디면 그만큼 좋은 이론이 될 수 있으므로, 추측으로 자신의 코드가 잘 실행될 것으로 생각하기보다는 반증을 거치는 것이 좋다고 생각합니다.

TDD 경험 공유

ios-tdd-JNaturalKorean

저는 JNaturalKorean이라는 라이브러리를 만들면서 TDD를 사용했습니다. 한국어 조사를 선택해주는 기능을 가지는데, 처음에 TDD를 하지 않을 때는 디버깅에도 많은 시간이 걸리고 유지 보수도 오래 걸렸습니다. 버그에 대한 자신감도 없었습니다. 그래서 다시 TDD를 사용해서 개발했는데 이제까지 버그를 발견하지 못했습니다.

Xcode에서 TDD하기

ios-tdd-xcode1 ios-tdd-xcode2

먼저 프로젝트 생성 시 UI를 체크하면 타깃이 설정됩니다. 그다음 Command+UControl+U로 테스트를 실행할 수 있습니다.

ios-tdd-code

앞서 말씀드린 RED-GREEN-REFACTOR를 생각하면서 입력을 모두 대문자로 바꾸는 코드를 작성해보겠습니다. 처음에는 구문 에러만 피하기 위한 코드를 작성하고 실패하는 테스트를 작성합니다. 이제 작성된 테스트를 통과하는 코드를 작성한 후 리팩토링을 합니다. 그런 다음 두 번째 테스트 코드를 작성하는데, RED로 에러가 발생합니다. 그다음 이 테스트를 통과할 수 있도록 함수를 작성한 후, 리팩토링을 거쳐 최종 코드를 완성합니다. 사실 Swift에는 capitalized 함수가 있어서 이 코드를 실제로 쓰실 일은 없겠네요.

그 밖의 팁

ios-tdd-tip

Request가 null이 아닐 때 함수를 실행하는 한 줄 팁과 iOS에서 언어를 로컬라이징하는 방법에 대한 링크를 공유하며 마칩니다.


이 글은 Realm과 OSXDev가 공동주최한 iOS Tech Talk의 강연을 요약한 것입니다. Realm에서 전체 강연을 다시 볼 수 있습니다.

다음: Realm Swift를 사용하면 iOS 앱 모델 레이어를 효과적으로 작성할 수 있습니다.

General link arrow white

컨텐츠에 대하여

이 컨텐츠는 저자의 허가 하에 이곳에서 공유합니다.

조원

철학과 아름다운 것들에 관심이 많습니다. 행복하게 사는 것, 그리고 나 자신이 되는 것, 그래서 좀 더 나은 존재가 되는 것에 의미를 두고 있습니다. 많이 배우고 언제까지나 성장하는 인간이고 싶습니다.

4 design patterns for a RESTless mobile integration »

close