본문 바로가기

1부 - 테스트 주도 개발의 핵심은 무엇인가?

반응형

테스트 주도 개발로 배우는 객체지향 설계와 실천 - 1부 서론 정리

 

테스트 주도 개발의 핵심은 무엇인가?

 

학습 과정으로서의 소프트웨어 개발

개발자들은 항상 존재하는 불확실성을 극복하기 위해 성장해야 한다.

그러기 위한 프로세스가 필요하다.

 

피드백은 가장 기본적인 도구다

각 주기마다 프로젝트를 배포하여 피드백 소요 시간을 최소화한다.

피드백은 중첩된 고리형 시스템으로 구성한다.

시스템은 언제나 통합된 상태이며 배포할 준비가 돼있다.

 

변화를 돕는 실천법

- 수동테스트를 자주 하는것은 비실용적이므로 테스트를 자동화한다.

- 꾸준히 리팩터링해 코드를 단순하게 유지한다.

    개발자들은 코드를 작성하는 것보다 코드를 읽는데 훨씬 더 많은 시간을 보낸다. 

- 코드 작성 전에 테스트를 먼저 작성한다.

    테스트하기 쉽도록 만들면 더 깔끔하고 모듈화된 코드가 만들어지기도 한다. 

 

테스트 주도 개발 간단 정리

실패하는 단위 테스트 작성 -> 테스트 통과시키기 -> 리팩터링 -> 실패하는 단위 테스트 작성 ...

 

장점

  • 다음 작업에 대한 인수 조건이 명확해진다. 작업이 끝나는 시점을 파악할 방법을 스스로 알아내야 하기 때문이다.
  • 느슨하게 결합된 구성 요소를 작성할 수 있게 되어 격리된 상태에서 더 높은 수준으로, 모두 결합된 상태로 구성 요소를 손쉽게 테스트할 수 있다.
  • 코드가 하는 일에 대한 실행 가능한 설명이 더해진다.
  • 완전한 회귀 스위트가 늘어난다.
  • 콘텍스트를 선명하게 인지하는 동안 오류를 탐지한다.
  • 언제 작업이 충분히 완료됐는지 알게 되어 금도금하듯 과도한 최적화를 하거나 불필요한 기능을 더하지 않게 된다.

실패하는 테스트 없이는 새 기능을 작성하지 말라.

 

국부적으로 생각하고 국부적으로 행동하라.

리팩터링은 기존 코드의 작동 방식을 바꾸지 않은 채로 기존 코드의 내부 구조를 변경하는 것을 의미한다.

리팩터링의 핵심은 코드가 구현하는 기능의 표현을 개선해 코드를 좀 더 유지 보수할 수 있게 만드는 것이다.

리팩터링은 작은 규모의 개선 사항을 찾아내는 식으로 진행되는 미시적 기법이다. 경험상 리팩터링의 여러 작은 단계를 엄격하고 지속하게 적용해야만 커다란 구조적 개선으로 이어질 수 있다.

리팩터링은 재설계와 같은 활동이 아니다. 재설계에서는 프로그래머가 큰 규모의 구조를 변경할 때 의식적인 결정을 내린다. 팀에서 재설계 결정을 취했을 때로 리팩터링 기법을 이용해 새로운 설계로 점진적이고 안전하게 나아갈 수 있다.

3부의 예제에서는 상당히 많은 리팩터링을 보게 될 것이다. 그러한 개념에 관한 표준 교재는 마틴 파울러의 [Flower 99]이다.

 

좀 더 큰 그림

테스트 코드 작성을 어디서 시작해야 할까?

그것보다 더 중요한 것은 언제 코드 작성을 멈춰야 하느냐다.

우리는 어떤 기능을 구현할 때 인수 테스트(acceptance test)를 작성하는것으로 시작한다. 여기서 인수 테스트란 만들고자 하는 기능을 시험하는 테스트를 말한다. 인수 테스트는 그것이 실패하는 동안 시스템이 아직까지 그 기능을 구현하지 않았다는 사실을 보여주고, 인수 테스트가 통과하면 그 작업이 끝난다. 

인수 테스트는 통과하는데 시간이 걸리기도 하므로, 보통 현재 작업중인 인수 테스트와 작업을 마친 기능에 대한 인수 테스트를 구분한다.

 

전 구간 테스트

 

테스트의 수준

외부 품질과 내부 품질

 

반응형