iOS/Common

Test Driven Development는 무엇이며, 왜 하는가?

TDCIAN 2022. 4. 14. 22:56

고오급 iOS 개발자가 되기 위해 고군분투 하고있는 요즘입니다!

 

그러다 연쇄 할인마 유데미에서 또 할인을 하길래 들을만한 강의 없나 하다가

유데미에서 굉장히 잘나가시는 무함마드 아잠 선생님의 TDD 강의를 구매하게 되었습니다!

사진을 클릭하면 강의 페이지로 넘어갑니다!

 

강의는 다 들었고! 배운 내용을 잊지 않기 위해 배운 내용 전파를 좀 해보겠습니다ㅋㅋ

 

 

1. TDD의 Life Cycle

TDD는 다음과 같은 생명 주기를 갖습니다.

(1) 실패하는 테스트를 작성

(2) 테스트를 성공하도록 만들기

(3) 성공한 테스트 코드를 리팩토링 하기

(4) 위 과정 반복하기

 

 

2. 왜 TDD를 해야 하는가?

(1) 걱정 없이 코드를 수정할 수 있습니다

- 테스트 코드가 작성 돼 있다면 여러분이 어떤 코드를 수정할 때 해당 수정 내용이 다른 코드에 영향을 미치는지 확인할 수 있기 때문에 보다 안전하고 자신감 있게 코드를 수정할 수 있습니다.

 

(2) UI 테스트를 통해 UI를 자동으로 테스트할 수 있습니다

- UI 테스트 코드를 작성하지 않았다면 특정 화면을 구성하는 과정에서 코드 수정 후의 결과를 살펴보기 위해 굉장히 많은 시간을 들여 UI 테스트를 진해야 합니다.

- UI 테스트를 활용한다면 이를 자동화할 수 있습니다

 

(3) 더 나은 아키텍처를 활용하도록 도와줍니다

- 테스트 코드를 작성하는 근본적인 목적은 테스트를 수행하는 것을 넘어 더 나은 아키텍처를 활용하게 하는 데 있습니다.

- 테스트 코드를 작성하는 과정에서 놓치는 함수나 클래스가 없는지를 확인하게 되고, 다른 컴포넌트들에 영향을 주지 않는 독립적인 컴포넌트 코드 작성이 가능해집니다.

 

 

3. 무엇을 테스트해야 하는가?

(1) 테스트해야 하는 것

- 앱의 도메인

    - 여러분이 만약 은행 앱을 만들게 되었다면, 예금 계좌에 있던 금액을 다른 계좌로 송급하는 로직이나, 연체가 발생했을 때 얼마만큼의 이자가 부가될지에 관한 로직을 테스트해야 합니다.

    - 여러분이 만약 병원 시스템에 관한 앱을 만들게 되었다면, 보험 청구 절차와 청구 결과에 따른 보험금 지급에 관한 로직을 테스트해야 합니다.

- UI 테스트

    - UI에 대한 테스트를 자동화 함으로써 시간을 절약할 수 있습니다.

 

 

(2) 테스트하지 않아도 되는 것

- 여러분이 작성하지 않은, IDE에 의해 기본적으로 생성되는 코드

    - IDE가 최초부터 발생시키는 코드에 대해서는 테스트 코드를 작성할 필요가 없습니다.

- 컴파일러에 의해 발생하는 이슈

    - 가끔씩 컴파일러가 여러분이 테스트할 필요가 없는 코드를 이슈로 잡을 수 있는데, 이런 코드에 대해서는 테스트 코드를 작성할 필요가 없습니다.

 

- 라이브러리 등 외부에서 들여온 코드

    - 라이브러리에 대한 테스트코드는 여러분들이 작성할 필요가 없습니다.

 

 

4. 언제 테스트해야 하는가?

(1) 새로운 프로젝트를 시작하게 됐을 때

(2) 기존 프로젝트를 개선할 때

(3) 도메인을 이해해야 할 때 -> TDD야말로 도메인 로직을 이해하는 가장 좋은 방법입니다.

(4) 해커톤의 경우에는 짧은 시간 내에 프로덕트를 만들어야 하기 때문에, 이런 상황에서는 테스트 코드 작성을 생략하는 것이 더 낫습니다.

 

 

 

5. TDD에 관한 오해

(1) 테스트는 QA의 몫이다?

- 테스트는 QA의 몫이 아니라 앱을 만드는 여러분의 몫입니다.

 

(2) TDD는 오래 걸린다?

- 테스트 코드를 작성하는 것은 분명히 더 많은 시간을 요구하는 일입니다.

- 하지만 여러분들이 6개월 후, 혹은 1~2년 후에 여러분의 앱에 새로운 기능을 추가하거나 수정해야 할 때, 결과적으로 테스트 코드는 여러분들의 시간을 절약시켜줄 것입니다.

 

(3) 클라이언트가 허락하지 않을 것이다?

- 여러분들이 클라이언트와 프로젝트의 기간 및 비용에 관해서 얘기할 때, 테스트 코드를 작성하는 것을 별도의 작업으로 설명하고 비용을 청구하면 클라이언트는 거절할 확률이 높습니다.

- 하지만 여러분이 자동차를 구매한다고 생각해 봅시다. 자동차에 브레이크를 추가하는 데 더 많은 비용이 들게 되니까 브레이크는 빼자고 한다면 여러분은 이를 허용할 수 있습니까?

- 테스트 코드를 작성하는 것은 필수적이라는 것을 잊지 말아야 합니다.

 

 

6. 나쁜 유닛테스트와 좋은 유닛 테스트

(1) 나쁜 유닛테스트

- 인스턴스가 정상적으로 생성되는지 확인하는 테스트 코드

- 프로퍼티에 값이 정상적으로 저장되는지 확인하는 테스트 코드

이런 테스트 코드는 의미 없이 엄청난 시간과 노력만 소비하게 만듭니다.

 

(2) 좋은 유닛테스트

- 다른 테스트에 독립적인 테스트 코드

- 제 3자의 개입 없이도 자동화될 수 있는 테스트 코드

- 별도의 동작 없이도 반복적으로 수행될 수 있는 테스트 코드

- 작성한 사람이 아닌 다른 사람이 봐도 읽을 수 있는 가독성 좋은 테스트 코드

 

 

7. 유닛테스팅이란 무엇인가?

- 메모리상에서 동작하는 코드입니다.

- 네트워크에 접근하지 않습니다.

- 데이터베이스에 접근하지 않습니다.

- 파일 시스템을 사용하지 않습니다.

 

- 유닛 테스트는 도메인 테스트입니다.

- 여러분들이 은행 앱을 만든다고 가정했을 때 다음과 같은 내용들의 유닛 테스트 코드가 작성되어야 합니다.

    - 출금 계좌와 입금 계좌가 정상적으로 존재하는지

    - 출금 계좌에 잔액이 있는지

    - 송금이 완료되었을 때 출금 계좌의 잔고가 줄어드는지

    - 송금이 완료되었을 때 입금 계좌의 잔고가 늘어나는지

    - 송금 수수료가 제대로 부과되는지

 

 

 

 

아잠 선생님께서 사용하시는 영어 발음이 아주 살짝 독특하다보니

유데미의 자동 생성 자막이 다소 간에 동떨어진 의미로 화면에 노출되는 경우가 많아

아예 자막을 끄고 강의를 들었습니다ㅋㅋ

 

아잠 선생님은 정말 훌륭한 선생님이지만,

아잠 선생님의 가르침을 오롯이 수행하기 위해서는 더 많은 수련이 필요한 듯 합니다ㅋㅋㅋ

 

개인 프로젝트에 테스트 코드 작성하는 연습을 계속 해봐야겠네요!