2 분 소요

0. Overview

테스트 코드를 작성 해본 경험은 있지만 실제 프로젝트에 적용한 적은 없었습니다. 늘 개발 일정은 운영 코드 위주로 산정했고 테스트 코드를 적용하기 위해 시도하는 시간을 들이지 못해서 이번에는 실제로 시간을 들여 도입하고 습관화 하는 걸 목표로 합니다.

우선 TDD 강의를 듣고 공부한 내용을 요약 하여 올립니다.

테스트 코드 작성기 Start !!



1. 코드 분해

코드 분해

  • 큰 문제는 작게 분해하여 풀이 가능
  • 작게 분해된 코드는 재사용 가능

코드 재사용

  • 반복되는 문제의 풀이는 재사용 가능
  • 소프트웨어 개발 비용 절감(엔지니어링)
  • 문제에 대한 해법 나누기 : 모듈화 함

모듈화

분해

  • 큰 시스템은 더 작은 하위 시스템으로 분해 가능
  • 분해된 서브 시스템은 교체 가능

조립

  • 작은 시스템은 조합해서 더 큰 상위 시스템으로 조립 가능
  • 모듈 재사용
    • 모듈 : 인터페이스 + 구현
      • 인터페이스
        모듈이 어느 기능을 제공하는 지? 그 기능을 제공 받기 위해서는 어떻게 모듈을 사용하는 지? 를 나타내는 설계
      • 구현
        실제로 그 기능이 어떻게 만들어지는 지
  • 라이브러리

단위 테스트

모듈을 만든 후 자동으로 테스트하여 사용자에게 신뢰감을 주는 인터페이스를 제공



2. 테스트 기법

1. 수동 테스트

  • UI를 통해서 기능 검증
  • 가장 온전한 코드 실행
  • 인수 테스트가 속함
  • 다른 테스트에 비해 실행 비용이 높고 결과 변동이 큼

    • 실행 비용 : 테스트 케이스 작성, 실행 등에 대한 시간과 비용(인건비 등)
    • 소프트웨어 회귀 발생
      소프트웨어 회귀

      새로운 기능이 추가 된 후, 기존 기능이 동작하지 않음


인수테스트

  • 배치된 시스템을 대상으로 검증
  • 전체 시스템 이상 여부 신뢰도가 높음
  • 높은 비용
    작성 비용 / 관리 비용 / 실행 비용
  • 피드백 품질이 낮음
    현상은 드러나지만 어느 부분이 원인인지 숨겨짐 -> 프로그래머가 찾아야함


2. 테스트 자동화

  • 기능을 검증하는 코드 작성
  • 테스트 코드 작성 비용이 소비 되지만, 실행 비용이 낮고 결과 신뢰도 높음
  • 테스트 코드 작성과 관리가 프로그래머의 역량에 크게 영향 받음
  • 단위(Unit) 테스트


단위(Unit) 테스트

  • 시스템의 일부(하위 시스템)을 대상으로 검증
  • 낮은 비용
    작성비용/ 관리 비용 / 실행 비용
  • 높은 피드백 품질
    버그가 어디서 났는 지에 대한 내용을 피드백을 받을 수 있음.
  • 전체 시스템 이상 여부 신뢰도가 낮음



3. 테스트 주도 개발

테스트 주도 개발 절차

  1. RED : 실패하는 테스트 추가

운영 코드 작성 전에 테스트 코드를 먼저 작성해서 테스트 실패를 확인 하는 단계

  1. GREEN : 테스트 통과 / 최소한의 코딩

운영 코드를 작성해서 새로운 테스트와 기존의 모든 작성된 테스트를 통과 하는 단계

  1. REFACTOR : 구현 설계 개선 / 테스트 통과 유지

테스트 결과가 유지 되는 걸 확인하면서 코드 구조 등 변경


테스트 실패

  1. 구체적인 하나의 요구사항을 검증하는 하나의 테스트를 추가

  2. 추가된 테스트가 실패하는 지 확인

    • 실패하는 것을 확인해야 테스트가 동작 함을 확인함
    • 실패 이유가 운영 코드 때문인지 확인해야함(테스트 코드를 잘못짜서 실패하는 경우가 있기 때문에..)

테스트 성공

  1. 추가된 테스트 + 기존 테스트 코드가 성공하도록 운영 코드 변경
  2. 테스트 성공 = 요구사항 만족 (코딩의 가장 중요한 임무)
  3. 테스트 성공을 위한 최소한의 변경만 함


리팩터링

  • 코드 베이스 정리
  • 구현 설계 개선 (!= 인터페이스를 변경하는 게 리팩터링 아님)
    • 가독성
    • 적응성
    • 성능
  • 모든 테스트 성공을 전제


켄드 벡의 설계 규칙

  1. Passes the tests : 테스트 통과

  2. Reveals intention : 의도 노출 (= 가독성 높힘)

  3. No duplication : 중복 제거

  4. Fewest elements : 가장 적은 요소 (=테스트에 포함 되지 않는 코드는 모두 제거함)



4. 마치며

현재 패스트캠퍼스의 The RED : 이규원의 현실 세상의 TDD : 안정감을 주는 코드 작성 방법를 50% 정도 수강했습니다. 수강 내용들을 정리하고 실제로 프로젝트에 도입한 내용들을 기록하겠습니다 :)

ref : https://fastcampus.co.kr/courses/203146/clips/

카테고리: ,

업데이트: