1. TDD (Test-Driven Development) 란?

테스트 코드를 먼저 만들고, 실제 프로덕션 코드를 나중에 만드는 개발 방법을 말한다

 

여기서 테스트 코드란 무엇일까

 

제품이 예상하는(원하는) 대로 동작하는지 확인하는 것이다

여기서 제품은 함수, 특정한 기능, UI, 성능, API 스펙 등이 있을 수 있다

 

프로그램을 작성하기 전에 테스트를 먼저 하라!
test the program before you write it!
- 켄트 백 kent Beck-

 

기존에 설계를하고 개발을 한 뒤 테스트를 진행하는거와 다르게

설계 후 테스트를 먼저 진행해서 설계를 수정하고 개발을 한다고 볼 수 있다

 

 

2. TDD를 사용하는 이유

- 변화에 대한 두려움을 줄여준다 (리팩토링 하기 편하다)

- 디버깅 시간을 줄여준다

- 동작하는 문서 역할을 한다

- 테스트 커버리지가 높아진다

- 오버 엔지니어링을 방지한다

- 설계에 대한 피드백이 빠르다

 

3. 테스트의 종류

테스트의 종류에는 대표적으로 4가지로 나눌 수 있다

- 단위 테스트 (Unit test or Component test)

- 통합 테스트 (Integration Test)

- 시스템 테스트 (System test)

- 인수테스트 (Acceptance Test)

 

해당 테스트들의 대략적인 내용을 아래 표로 살펴보고

단위 테스트와 통합테스트에 대해 더 자세히 알아 보겠다

 

  대상 누가 환경 어떻게 대상 문서 (산출물
단위
테스트
단위모듈 개발자 개발환경 White Box 최소단위 함수,
모듈
요구사항정의서,
개념/상세설계서,
기능설계서,
명세서,
인터페이스 설계서
통합
테스트
통합모듈 개발자 개발환경 Gray Box 외부 인터페이스
연결,
내부 모듈간 연결
단위산출물,
통합시험계획서,
절차서,
결과서
시스템
테스트
전체
시스템
테스터
(제3자)
실환경 Gray Box 기능/비기능 테스트
비기능 : 성능/
신뢰성
테스트 도구 사용,
연계 테스트
(입/출력 모듈)
단위+통합산출물,
실증시험계획서,
절차서,
결과서,
메뉴얼
인수
테스트
전체
시스템
사용자, 고객 실환경 Black Box 출시 예정제품 단위+통합+
시스템,
산출물,
결함리포트,
결과보고서,
피드백

 

4. 단위 테스트 (Unit Test)

단위 테스트는 하나의 모듈을 기준으로 독립적으로 진행되는 가장 작은 단위 테스트이다

 

여기서 모듈은 애플리케이션에서 작동하는 하나의 기능 또는 메서드를 뜻한다

 

예를들어 웹에서 로그인 메서드에 대한 독립적인 테스트가 1개의 단위테스트 라고 할 수있다

 

즉 단위 테스트는 애플리케이션을 구성하는 하나의 기능이 올바르게 동작하는지를

독립적으로 테스트하는것으로 어떤 기능이 실행되면 어떤 결과가 나온다 정도로 테스트를 진행한다

 

단위 테스트 작성의 필요성

일반적으로 실무에서 테스트 코드를 작성한다고 하면 거의 단위 테스트를 말한다고 한다

 

통합 테스트는 실제 여러 컴포넌트들 간의 상호작용을 테스트하기 때문에

모든 컴포넌트들이 구동된 상태에서 테스트를 하게된다

 

이때 통합 테스트를 위해서 캐시, 데이터베이스 등 다른 컴포넌트들 과 실제 연결을 해야하고

시스템을 구성하는 컴포넌트들이 많아 질수록 테스트를 위한 비용이 상당히 커진다

 

반면 단위 테스트는 해당 부분만 독립적으로 테스트 하기 때문에 어떤 코드를 리팩토링하여도

빠르게 문제 여부를 확인할 수 있다

 

- 테스트에 대한 시간과 비용을 절감 할 수 있다

- 새로운 기능 추가시 수시로 빠르게 테스트 할 수 있다

- 리팩토링 시에 안정성을 확보할 수 있다

- 코드에 대한 문서가 될 수 있다

 

그래서 위에서 얘기한 TDD 에서 얘기하는 테스트도 단위 테스트를 의미하고

테스트 코드를 수시로 빠르게 돌리면서 문제를 파악할 수 있는것이다

 

5. 통합 테스트 (Integration Test)

통합테스트는 모듈을 통합하는 과정에서 모듈간의 호환성을 확인하기 위해 수행되는 테스트이다

 

일반적으로 애플리케이션은 여러개의 모듈들로 구성되어 있다

 

모듈끼리 메세지를 주고 받으면서 기능을 수행하게 되는데

그렇기에 통합된 모듈들이 올바르게 연계되어 동작하는지 검증이 필요하다

 

이러한 목적으로 진행되는 테스트가 통합테스트 라고 할 수 있다

 

그렇기에 통합테스트는 독립적인 기능에 대한 테스트가 아니라

웹 페이지로부터 API를 호출하여 올바르게 동작하는 지를 확인하는 것이다

 

6. 좋은 테스트 코드를 작성하는 방법 FIRST

F (Fast), I (Independent), R (Repeatable), S (Self-Validating), T (Timely)

 

Fast

테스트는 빠르게 동작하며 자주 돌릴 수 있어야 한다

 

Independent

각각의 테스트는 독립적이며 서로 의존해서는 안된다

 

Repeatable

어느 환경에서도 반복 가능해야 한다

 

Self-Validating

테스트는 성공 또는 실패로 boolean 값으로 결과를 내어 자체적으로 검증되어야 한다

 

Timely

테스트는 적시에, 즉 테스트하려는 실제 코드를 구현하기 직전에 구현 해야한다

 

7. 마무리

단위 테스트의 가장 큰 장점은 내가 개발한 것들을 빠르게 검증 할 수 있다는 것이라 생각한다

 

단위 테스트를 통해 내 코드를 바로 검증받고 통과하지 못했다면 수정 후 빠르게 다시 검증 받는것이다

 

이런 과정을 통해서 버그를 잡고 개발 비용을 줄여나갈때 비로소 테스트의 가치를 느끼는것 같다

 

개발을 하는데 있어서 비용의 70%가 유지보수 비용이라고 하는데

 

단위 테스트를 통해 그러한 유지보수 비용을 줄일 수 있다면 얼마나 큰것인가 라는 생각을 해본다

'CS' 카테고리의 다른 글

[CS] 네트워크 IP 주소  (0) 2022.12.04
[CS] 네트워크 기기  (0) 2022.12.03
[CS] 계층 간 데이터 송수신 과정, PDU  (0) 2022.12.02
[CS] 물리 계층과 데이터 링크 계층  (0) 2022.12.01
[CS] TCP / IP 4계층  (0) 2022.11.30