단위테스트

요구 사항

  • 주문 목록에 음료 추가 / 삭제 기능

  • 주문 목록 전체 지우기

  • 주문 목록 총 금액 계산하기

  • 주문 생성하기


1. 수동 테스트 vs 자동화된 테스트

단위 테스트

  • 작은 코드 단위를 독립적으로 검증하는 테스트

    • 작은 : 클래스 or 메서드

    • 독립적 : 외부 상황에 의존하는 테스트가 아닌, 클래스 or 메서드만 검증

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

JUnit 5

  • 단위 테스트를 위한 테스트 프레임워크

  • XUnit - 켄트 백

    • XUnit 으로 시작해서 자바에서는 JUnit 으로 발전되었다.

AssertJ

  • 테스트 코드 작성을 원활하게 돕는 테스트 라이브러리

  • 풍부한 API, 메서드 체이닝 지원

결론

  • 일관성이 부족한 개인이 테스트하는 것은 불확실성을 유발한다.

  • 테스트 도구들을 사용해서 일관적인 자동화된 테스트를 하자!


2. 테스트 케이스 세분화하기

요구사항

  • 한 종류의 음료 여러 잔을 한 번에 담는 기능

질문하기 : 암묵적이거나 아직 드러나지 않은 요구사항이 있는가?

테스트 케이스 세분화하기

  • 해피 케이스

  • 예외 케이스

  • 경계값 테스트가 매우 중요하다.

    • 범위(이상, 이하, 초과, 미만), 구간, 날짜 등

    • 경계값이나 경계값 주변값을 테스트 검증값으로 설정해서 테스트하는 것이 중요하다.

    • 예를 들어, 3이상 인지 검증해라.

      • 해피 케이스 : 3

      • 예외 케이스 : 2


3. 테스트하기 어려운 영역을 분리하기

요구사항

  • 가게 운영 시간(10:00 ~ 22:00) 외에는 주문을 생성할 수 없다.

테스트하기 어려운 영역

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

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

  • 우리가 작성한 코드가 외부 세계에 영향을 주는 코드

    • 외부 세계 자체가 우리가 테스트하기 어렵다.

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

테스트하기 쉬운 영역 (순수 함수)

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

  • 외부 세상과 단절된 형태

  • 테스트하기 쉬운 코드

테스트하기 여러운 영역 구분하고 분리하기

  • 테스트 하기 어려운 부분은 외부(매개변수 등등..) 로부터 받는 구조로 변경하면 된다.

  • 테스트 하고자 하는 부분이 무엇인가?

    • 영업 시간

  • 내부 로직을 외부로 분리할수록 테스트 가능한 코드는 많아진다.


4. 키워드 정리

  • 단위 테스트

  • 수동 테스트, 자동화 테스트

  • JUnit 5, AssertJ

  • 해피 케이스, 예외 케이스

  • 경계값 테스트

  • 테스트하기 쉬운/어려운 영역(순수 함수)

  • lombok (사용 가이드)

    • @Date, @Setter, @AllArgsConstructor 지양

    • 양방향 연관관계 시 @ToString 순환 참조 문제

Last updated