[인프런 워밍업 클럽 2기 클린코드&테스트코드] 3주차 발자국

[인프런 워밍업 클럽 2기 클린코드&테스트코드] 3주차 발자국

출처: Practical Testing: 실용적인 테스트 가이드

1. 학습 내용 요약

  • 수동으로 테스트할 경우

    • 누락되는 케이스 발생

       

    • 늦은 피드백

    • 유지보수 어려움

    • 소프트웨어 신뢰도 낮아짐

  • 테스트 코드를 작성하지 않는다면

    • 변화가 생기는 매순간마다 발생할 수 있는 모든 Case를 고려해야 함

    • 변화가 생기는 매순간마다 모든 팀원이 동일한 고민을 해야 함

    • 빠르게 변화하는 소프트웨어의 안정성을 보장할 수 없음

  • 테스트 코드가 병목이 된다면

    • 프로덕션 코드의 안정성을 제공하기 어려움

    • 테스트 코드 자체가 유지보수하기 어려운, 새로운 짐이 되어버림

    • 잘못된 검증이 이루어질 가능성이 생김

  • 올바른 테스트 코드는

    • 자동화 테스트로 비교적 빠른 시간 안에 버그 발견 가능, 수동 테스트에 드는 비용 절약

    • 소프트웨어의 빠른 변화 지원

       

  • 단위 테스트

    • 작은 코드 단위(클래스 or 메서드)를 독립적으로 검증하는 테스트

    • 검증 속도가 빠르고, 안정적

       

  • 테스트 케이스 세분화

    • 해피 케이스

    • 예외 케이스

    • 경계값 테스트 → 범위(이상, 이하, 초과, 미만), 구간, 날짜 등

  • 테스트하기 어려운 영역을 구분하고 분리하기

    • 현재 일시와 같이 테스트가 어려운 코드가 들어오는 경우

    • 전체가 테스트하기 어려워질 수 있음

    • 테스트가 어려운 부분을 외부로 분리

       

  • 테스트하기 어려운 영역

    • 관측할 때마다 다른 값에 의존하는 코드

      • 현재 날짜/시간, 랜덤 값, 전역 변수/함수, 사용자 입력 등

    • 외부 세계에 영향을 주는 코드

      • 표준 출력, 메시지 발송, 데이터베이스에 기록하기 등

  • 테스트하기 좋은 함수

    • 순수함수 (pure functions)

      • 같은 입력에는 항상 같은 결과

      • 외부 세상과 단절된 형태

      • 테스트하기 쉬운 코드

  • Test Driven Development

    • 프로덕션 코드보다 테스트 코드를 먼저 작성하여 테스트가 구현 과정을 주도하도록 하는 방법론

  • TDD의 3단계

    • Red

      • 실패하는 테스트 작성

    • Green

      • 테스트 통과

      • 최소한의 코딩

         

    • Refactor

      • 구현코드 개선

      • 테스트 통과 유지

  • 선 테스트 작성, 후 기능 구현

    • 복잡도가 낮은, 테스트 가능한 코드로 구현할 수 있게 해줌

    • 쉽게 발견하기 어려운 엣지 케이스를 놓지지 않게 해줌

    • 구현에 대한 빠른 피드백 가능

    • 과감한 리팩토링 가능

       

  • BDD 스타일로 작성

    • Behavior Driven Development

    • TDD에서 파생된 개발 방법

    • 함수 단위의 테스트에 집중하기보다, 시나리오에 기반한 테스트케이스(TC) 자체에 집중하여 테스트

       

  • BDD Tool

    • Given

      • 시나리오 진행에 필요한 모든 준비 과정 (객체, 값, 상태 등)

    • When

      • 시나리오 행동 진행

    • Then

      • 시나리오 진행에 대한 결과 명시, 검증

  • 통합 테스트

    • 여러 모듈이 협력하는 기능을 통합적으로 검증

    • 일반적으로 작은 범위의 단위테스트만으로는 기능 전체의 신뢰성 보장 불가

    • 풍부한 단위 테스트 & 큰 기능 단위를 검증하는 통합 테스트


    2. 미션 회고

    Day 12. 주어진 코드에 대하여 단위 코드를 작성해보는 미션이었다. 직접 테스트 코드를 작성해보는 건 이번이 처음이었다. 이번 미션에서 어려웠던 부분은 테스트하기 어려운 부분을 통제하는 것이었다. 예를 들어 static으로 클래스 내부에 선언된 Scanner의 경우 입력값을 두 번 이상 넣기가 어려웠다. Scanner를 변수로 빼는 부분도 고려해볼 수 있었지만, 원래 코드의 의도를 테스트때문에 해치는 것 같아 망설이게 되었다. 다행히 강의 뒷편에서 이러한 고민을 다루는 부분이 있는 것 같아 학습 후에 이번 미션에서 고민했던 것들을 확인해 볼 수 있을 것 같다.

     


    3. KPT

    • Keep

      • 미션을 해결하고 다른 사람들의 코드들을 보면서 놓쳤던 케이스들을 확인하였다.

    • Problem

      • 테스트 환경을 제어하는 부분들 중 어려운 것이 많았다.

    • Try

       

      • 강의 후반부에서 지금까지 생긴 궁금증들을 많이 다루고 있어서, 나중에도 기억할 수 있도록 정리하면서 들어야겠다.


    4. 느낀점

    3주차 테스트 코트 강의가 시작되었다. 워밍업 클럽에 참가한 이유 중에 하나이기도 하다. 이전에 서비스 코드는 작성해 본 적이 있지만 단위 테스트, 통합 테스트는 작성해 본 적이 없었다. 테스트를 작성하지 않았던 이유는 강의 초반에서 강사님이 언급했던 것처럼 '귀찮음'이 가장 컸었다. 그러나 여러 테스트 코드를 작성하고, 전체 테스트를 돌려 모두 성공했을 때의 기쁨은 그 귀찮음을 충분히 보상해 주는 것 같다. 또한, TDD 방식으로 구현을 연습해보았는데, 테스트를 먼저 작성하고 코드를 작성하는 방식이 다소 낯설었다. 그러나 기존의 구현 우선 방식보다 확실히 여러 엣지 케이스를 떠올리기가 쉬웠다. 이 방식을 습관화하여 자연스럽게 활용할 수 있도록 노력해야겠다.

댓글을 작성해보세요.

채널톡 아이콘