database by narae :p

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

테스트

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

dbbymoon 2021. 12. 5. 17:50

테스트 주도 개발로 배우는 객체 지향 설계와 실천

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

 

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

소프트웨어 프로젝트 : 사람 + 응용 분야 + 기술 등

미처 예상하지 못한 요소가 많음

개발자들은 구성 요소의 동작 방식을 배우면서 프로젝트를 마무리한다.

: 불확실한 변화를 예측하려면 경험이 늘어남에 따라 불확실성을 해결하는데 도움이 될 프로세스가 필요하다.

 

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

경험에 의거한 피드백을 이용해 시스템과 그 용도에 관해 배운 후, 그 배운바를 시스템에 적용

배포 : 내린 가정을 검사할 기회 => 실제 진행 상황을 측정하고, 오류를 탐지하고 수정하고, 배운 바에 따라 현재 계획을 조정한다.

  • 점진적이고 반복적인 개발

: 중첩된 피드백 고리의 집합으로 구성된 프로젝트에는 개발이 점진적이고 반복적이다.

  • 점진적인 개발 : 모든 계층과 구성요소를 구축한 다음 시스템을 기능별로 구축한다. 각 기능은 시스템의 모든 관련 부분에 걸쳐 전 구간에 이르는 조각으로 구현한다. 시스템은 언제나 통합된 상태이며 배포할 준비가 되어있다.
  • 반복적인 개발 : 계속해서 충분한 상태에 이를 때까지 피드백에 응답해 기능 구현을 다듬는다. 

 

1.3. 변화를 돕는 실천법

  • 회귀 오류를 잡아줄 꾸준한 테스트 : 기존 기능을 망가뜨리지 않고도 새 기능을 추가할 수 있다.
  • 테스트 자동화 : 구축과 배포, 시스템 버전 변경에 드는 비용을 줄이려면 테스트를 자동화해야 한다.
  • 코드 단순화 : 코드 설계를 개선하고 단순화하고, 중복을 제거하고, 코드가 명확하게 자신의 역할을 표현하게끔 코드를 사용할 때마다 꾸준히 코드를 리팩토링해야한다.
  • TDD => 테스트를 설계활동으로. 테스트를 사용해 코드에서 하고 싶은 바에 관한 생각을 명확하게 한다.

개발 내내 테스트를 작성한다면 변경에 대한 자신감을 주는 자동화된 회귀테스트를 구축할 수 있다.

 

1.4. 테스트 주도 개발 간단 정리

TDD

  • 과정
  • 작성할 때의 장점
  • 실행할 때 장점

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

  • 국부적으로 생각하고 국부적으로 행동하라
  • 리팩토링 : 기존 코드의 작동 방식을 바꾸지 않은 채로 기존 코드의 내부 구조를 변경하는 것. 구현하는 기능의 표현을 개선해 코드를 좀 더 유지보수할 수 있게 만드는 것.
  • 리팩터링은 이해하기 쉽고 안전할 정도로 규모가 작아야 한다. 

 

1.5. 좀 더 큰 그림

클래스를 대상으로 한 단위 테스트만 작성할 때 문제점

  • 아무데서도 호출하지 않거나, 시스템의 나머지 부분과 통합할 수 없는 테스트가 발생

인수 테스트 : 만들고자 하는 기능을 시험하는 테스트

  • 기능을 대상으로 작업할 때 작성하려는 코드가 실제로 필요한지 가늠한다.
  • 즉, 직접 관련된 코드만 작성한다.

=> 언제 코드 작성을 멈춰야 하는지 = 코드 작성을 어디서 시작해야 하는지

  • 실패하는 인수 테스트 작성
  • 진척도를 측정하는 수단
  • 테스트 스위트가 증가하면 시스템을 변경할 때 회귀 실패에서 보호받을 수 있다.
  • 실패하는 단위테스트 작성 -> 테스트 통과 -> 리팩터링
  • 코드 품질 유지

 

1.6. 전 구간 테스트

인수테스트에서는 시스템 내부 코드를 가능한 한 직접 호출하지 말고 시스템 전 구간을 시험해야 한다.

: 외부에서 유입되는 시스템하고만 상호 작용한다.

 

1.7. 테스트의 수준

  • 인수 테스트 : 전체 시스템이 동작하는가?
  • 통합 테스트 : 변경할 수 없는 코드를 대상으로 코드가 동작하는가?
  • 단위 테스트 : 객체가 제대로 동작하는가? 객체를 이용하기가 편리한가?

 

1.8. 외부 품질과 내부 품질 

  • 외부 품질 : 시스템이 고객과 사용자의 요구를 얼마나 잘 충족하는가(기능, 신뢰성, 가용성, 응답성 등)
  • 내부 품질 : 시스템이 개발자와 관리자의 요구를 얼마나 잘 충족하는가(이해하기 쉬운가, 변경하기 쉬운가 등) => 시스템의 동작 방식을 안전하고 예상 가능한 상태로 바꿀 수 있게 만드는 것이 중요
  • 전구간 테스트
  • 단위 테스트 
  • 결합도 : 한 변경이 다른 것의 변경을 강제한다면 요소들이 결합된 상태
  • 응집도 : 해당 요소의 책임이 의미 있는 단위를 형성하는지 나타내는 척도 

'테스트' 카테고리의 다른 글

테스트 주도 개발 주기의 유지  (0) 2021.12.05
테스트 주도 주기 시작  (0) 2021.12.05
도구 소개  (0) 2021.12.05
객체를 활용한 테스트 주도 개발  (0) 2021.12.05