[Spring] 단위 테스트

Minit88·2023년 4월 28일
1

Spring

목록 보기
13/16
post-thumbnail

Lab_01 : 단위 테스트란?

  • 위 그림은 커피 주문 샘플 애플리케이션에 대해 단위라는 기준을 적요해서 표현한 그림이다.

기능 테스트

  • 그림을 보면 기능 테스트가 테스트의 범위가 제일 크다.
  • 기능 테스트는 주로 애플리케이션을 사용하는 사용자 입장에서 애플리케이션이 제공하는 기능이 올바르게 동작하는지를 테스트한다.
  • 기능 테스트를 하는 주체는 주로 해당 애플리케이션을 개발한 개발자가 될 수도 있지만 일반적으로는 테스트 전문 부서 또는 외부 QA 업체가 된다.
  • 기능 테스트의 경우 API 툴이나 데이터베이스까지 연관되어 있어서 HTTP 통신도 해야 되고, 데이터베이스 연결도 해야 되는 등 우리가 개발한 애플리케이션과 연관된 대상이 많기 때문에 흔힌 이야기하는 단위 테스트로는 부르기 힘들다.

통합 테스트

  • 통합 테스트는 클라이언트 측 툴 없이 개발자가 짜 놓은 테스트 코드를 실행시켜서 이루어지는 경우가 많다.
  • 예를 들어, 개발자가 Controller의 API를 호출하는 테스트 코드를 작성한 후 실행하면 서비스 계층과 데이터 액세스 계층을 거쳐 DB에 실제로 접속해서 기대했던 대로 동작을 하는지 테스트하는 것은 통합 테스트의 하나이다.
  • 통합 테스트 역시 애플레케이션의 여러 계층이 연관되어 있으며, DB까지 연결되어 있어서 독립적인 테스트가 가능하다고 볼 수는 없어 단위 테스트라고 하기에는 그 범위가 여전히 크다.

슬라이스 테스트

  • 슬라이스 테스트는 애플리케이션을 특정 계층으로 쪼개어서 하는 테스트를 의미한다.
  • API 계층,서비스 계층,데이터 액세스 계층 각각 슬라이스 테스트의 대상이 될 수도 있다.
  • 슬라이스 테스트 역시 해당 계층에서 HTTP 요청이 필요하고, 외부 서비스가 연동되기도 하며 특히나 데이터 액세스 계층의 경우 여전히 DB와 연동되어 있기 때문에 슬라이스 테스트는 단위 테스트보다는 말 그대로 계층별로 쪼개어 테스트한다는 의미의 슬라이스 테스트라고 부른다.

단위 테스트

  • 비즈니스 로직에서 사용하는 클래스들이 독립적으로 테스트하기 가장 좋은 대상이기 때문에 단위 테스트라고 부르는 경우가 많다
  • 단위 테스트 코드는 메서드 단위로 대부분 작성

단위 테스트를 해야 되는 이유

  • IDE를 실행시키고 , Postman 을 열어서 HTTP 요청을 보내는 일들을 단순화 할 수 있다.
  • 코드가 의도한 대로 동작하는지 그 결과를 빠르게 확인할 수 있다.
  • 작은 단위의 테스트로 미리미리 버그를 찾을 수 있기 때문에 애플리케이션의 덩치가 커진 상태에서 문제의 원인을 찾아내는 것보다 상대적으로 더 적은 시간 안에 문제를 찾아낼 가능성이 높다.

테스트케이스란

  • 테스트를 위한 입력 데이터, 실행조건,기대 결고라르 표현하기 위한 명세를 의미하는데, 한마디로 메서드 등 하나의 단위를 테스트하기 위해 작성하는 테스트 코드라고 생각하면 된다.

단위 테스트를 위한 FIRST 원칙

  • Fast
    • 일반적으로 작성한 테스트 케이스는 빨라야 한다는 의미이다.
  • Independent
    • 각각의 테스트 케이스는 독립적이어야 한다.
    • 일반적으로 우리가 테스트 케이스를 작성할 때, 클래스 단위로 해당 클래스 내의 메서드 동작을 테스트한다.
    • 메서드는 여러 개 존재할 가능성이 높을 테니 테스트 클래스 안에 테스트 케이스도 하나 이상이 된다.
    • 이때, 어떤 테스트 케이스를 먼저 실행시켜도 실행되는 순서와 상관없이 정삭적인 실행이 보장되어야 한다.
    • 예를 들어, A라는 테스트 케이스를 먼저 실행시킨 후에 다음으로 B라는 테스트 케이스를 실행시켰더니 테스트에 실패하게 된다면 테스트 케이스끼리 독립적이지 않은 것이다.
  • Repeatable
    • 테스트 케이스는 어떤 환경에서도 반복해서 실행이 가능해야 된다는 의미이다.
    • IntelliJ 같은 IDE에서 버튼을 눌러서 실행을 하든, Gradle 같은 빌드 태스크를 직접 입력해서 실행을 하든, 로컬 환경이나 서버 환경에서 실행하든 반복해서 같은 결과를 확인할 수 있어야 한다.
    • 외부 서비스나 외부 리소스가 연동되는 경우 앞에서 언급한 원칙들을 포함해서 동일한 테스트 결과 역시 보장하지 못하기 때문에 단위 테스트 시에는 외부의 서비스나 리소스의 연동을 끊어주는 것이 바람직하다.
  • Self-validating
    • 단위 테스트는 성공 또는 실패라는 검증 결괄르 보여주어야 한다
    • 즉, 테스트 케이스 스스로 결과가 옳은지 그른지 판단할 수 이썽야 한다는 것이다.
  • Timely
    • 단위 테스트는 테스트하려는 기능 구현을 하기 직전에 작성해야 한다.
    • 구현하고자 하는 기능을 단계적으로 조금씩 업그레이드하면서 그때그때 테스트 케이스 역시 단계적으로 업그레이드하는 방식이 더 낫다는 사실을 기억하면 좋다
profile
" To be BE "

0개의 댓글