Code States/TIL

[0420] 지속적 통합 - 테스트

ki1111m2 2023. 4. 20. 17:15

학습 목표

  • 지속적 통합의 필요성을 설명할 수 있다.
    • 지속적 통합 개념이 나오게 된 배경을 이해할 수 있다.
    • 지속적 통합의 장점을 설명할 수 있다.
    • 지속적 통합의 원칙을 이해할 수 있다.
  • 빌드/테스트의 개념을 이해할 수 있다.
    • 테스트 주도 개발(TDD)에 대한 정의와 필요성을 설명할 수 있다.
    • 테스트 주도 개발(TDD) 사이클을 설명할 수 있다.
    • 테스트의 종류 (단위 테스트, 통합 테스트, E2E 테스트)를 설명할 수 있다.
  • 릴리스의 개념을 이해할 수 있다.
  • CI 도구(여기서는 GitHub Action)를 이용하여 지속적 통합이 이루어지는 과정을 직접 구현할 수 있다
  • 다양한 CI 도구의 차이점을 이해할 수 있다.
  • 코드와 환경 변수를 분리해야 하는 이유를 설명할 수 있다.

  • 단위 테스트
    • 검증이 필요한 코드에 대해 테스트 케이스를 작성하는 절차 혹은 프로세스
    • 즉각적인 피드백이 나옴
    • 하나의 메서드가 잘 작동함은 보장할 수 있지만 그들이 결합하는 시점에서도 잘 작동하는지에 대해서는 보장할 수 없음
  • 통합 테스트
    • 모듈을 통합하는 과정에서 모듈 간 호환성의 문제를 찾아내기 위해 수행되는 테스트
    • 단위 테스트에서 찾지 못하는 통합 시 발생하는 버그 등을 찾을 수 있음
    • 도구
      • JavaScript: mocha, chai
      • Java: JUnit
  • E2E 테스트(End To End Test)
    • 전체 시스템이 제대로 동작하는지 확인하기 위한 테스트
    • 사용자의 입장에서 사용자가 사용하는 상황을 가정하고 시뮬레이션을 진행함
    • 장점
      • 실제 상황에서 발생할 수 있는 에러를 사전에 발견할 수 있음
    • 단점
      • 테스트 작성 시 들어가는 비용이 많음
      • 수행 속도가 느림
      • “실패했다”라는 결과만 있기 때문에 피드백의 질이 낮음
    • 도구
      • Cypress
      • Nightwatch
      • TestCafe

테스트 주도 개발


  • Test Driven Development, TDD
  • 테스트가 기능의 디자인을 주도하는 반복적인 개발 방법론
  • 기존의 개발 과정

  1. 요구사항 분석
  2. 요구 사항을 토대로 디자인(설계)을 진행
  3. 설계에 맞추어 기능을 개발.
  4. 구현 완료 후 수동으로 기능을 테스트
  5. 원하는 대로 동작하지 않거나 문제가 발생하면 디버깅을 통해 원인을 파악하고 수정
  6. 3 - 4의 과정을 개발이 완료될 때까지 반복
    • 테스트 주도 개발 과정

  1. 요구사항 분석
  2. 요구 사항을 토대로 디자인(설계)을 진행
  3. 설계를 기반으로 기능 테스트 진행
    1. 실패 시 다시 설계
  4. 테스트가 성공했다면 개발 진행
  5. 3 - 4의 과정을 개발이 완료될 때까지 반복
  • 사이클

  • 큰 단위의 문제를 작은 단위로 나누어 지속적인 피드백을 통해 목표를 개선해 나가는 방향으로 진행됨
  • 장점
    • 더욱 명확한 기능과 구조를 설계할 수 있음
    • 재사용성이 고려된, 모듈화된 코드를 작성할 수 있음
    • 설계 수정 시간과 디버깅 시간의 단축
      • 단위 테스트 기반의 데스트 코드를 작성하기 때문에 추후 프로그램에 문제가 발생할 경우, 각각의 모듈별로 테스트를 진행하면서 문제 지점을 쉽게 찾아낼 수 있음
    • 완성도 높은 설계
      • 코드의 기능, 정의 등 구조적인 문제에 대하여 명확하게 접근할 수 있음
      • 다양한 예외상황에 대해서도 고려하게 되므로 완성도 높은 설계로 이어짐
    • 유지 보수의 용이성
      • 기능 추가 등의 유지 보수를 해야 하는 상황이라면 기존 코드에 끼칙ㄹ 영향에 대해 생각해야 함
      • TDD 이전의 개발 방식에선 단순한 기능이라도 수정되거나 추가되는 경우 많은 코드에 대하여 테스트를 진행해야 했음
      • TDD를 진행한다면 변경 점에 따른 테스트를 진행해야 하는 상황에 대한 부담이 줄어들 수 있음