[SEB BE] Section 3. 단위테스트

박두팔이·2023년 3월 3일
0

스프링프레임워크

목록 보기
12/17

단위테스트

애플리케이션의 일반적인 테스트 분류

1. 단위 테스트 ?

비즈니스 로직이 주로 단위 테스트의 대상이 되며, 단위테스트 코드는 메서드 단위로 대부분 작성된다.

단위테스트는 우리가 작성한 코드가 우리의 기대대로 빠르게 동작하는지 확인할 수 있는 테스트이다. 따라서 최대한 독립적이며 작은 단위일 수록 좋다.

왜냐하면, 연관된 기능들을 생각하지 않아도 되기 때문이다. 또한 테스트 코드가 단순해져 빠르게 테스트를 수행할 수 있다.

DB를 사용하는 단위테스트일 경우, 데이터베이스의 상태가 테스트 전/후로 동일하게 유지된다면 단위테스트에 포함 될 수 있다.


2. 단위 테스트의 필요성

1️⃣ Postman을 열어 HTTP요청을 보내는것과 같은 번거로운 일들을 단위 테스트를 통해 단순화 시켜 생산성을 높일 수 있다.

2️⃣ 우리가 작성한 코드가 우리의 의도대로 코드가 기능하는지 결과를 빠르게 확인할 수 있다.

3️⃣ 단위테스트를 통해 버그를 미리 찾아 문제를 해결할 수 있다.

4️⃣ 버그 리포트를 전달받을 경우 버그가 발생한 코드(기능)의 테스트 케이스를 통해 문제가 발생한 원인을 단계적으로 찾기에 용이하다.

💡 테스트케이스란?

테스트를 위한 입력 데이터, 실행조건, 기대결과를 표현하기 위한 명세를 의미한다.

비지니스 로직에서 메서드 단위를 테스트하기 위해 작성된 코드로 이해하면 된다. 이 테스트 코드안에는 입력데이터, 실행조건, 기대결과의 로직이 포함되기 때문이다.


3. 단위 테스트를 위한 FIRST원칙

F (Fast, 빠르게)

  • 테스트케이스의 실행시간은 빠르게 동작해야한다.

I (Independent, 독립적으로)

  • 각각의 테스트케이스는 독립적이어야 한다.
  • 테스트 케이스는 클래스단위로 메서드가 동작한다.
  • 따라서 하나의 클래스 안에는 여러개의 메서드가 존재하며 테스트 케이스는 메서드단위로 동작하기 때문에 여러개의 테스트케이스가 하나의 클래스 안에 존재할 것이다.
  • 어떤 테스트 케이스를 먼저 실행시켜도 실행되는 순서와 상관없이 정상적인 실행이 보장되어야 한다.

R (Repeatable, 반복 가능하도록)

  • 로컬환경이나 서버환경등 어떤 환경에서도 반복해서 같은 결과를 확인할 수 있어야 한다.
  • 외부 서비스나 리소스가 연동된다면 동일한 테스트결과를 보장하지 못하기 때문에 단위테스트에서는 외부와의 연동을 끊어주는 것이 좋다.

S (Self-validating, 셀프 검증이 되도록)

  • 테스트 케이스 스스로 성공 또는 실패라는 검증 결과를 판단할 수 있어야 한다.

T (Timely, 시기 적절하게)

  • 단위테스트는 기능 구현 직전에 작성되야한다.
  • TDD(테스트 주도 개발)개발 방식에서는 기능구현 전에 실패하는 테스트 케이스를 먼저 작성하는 방식을 취하지만 많은 연습이 필요하기때문에 쉽지않은 것이 현실이다.
  • 따라서 구현할 기능을 단계적으로 업그레이드하면서 테스트 케이스를 업그레이드 하는 방식이 더 낫다.

JUnit ?

자바 기반의 소프트웨어를 테스트하기 위해 사용하는 표준 테스트 프레임워크

단위테스트를 제일 쉽고 빠르게 적용할 수 있는 것이 바로 헬퍼(helper) 클래스 or 유틸리티(utility) 클래스이다.

예를들어,

커피를 주문한 회원이 보유한 스탬프의 갯수 + 회원이 주문한 커피 수량 = 누적 스탬프의 수

누적 스탬프의 수를 계산해주는 헬퍼클래스가 있다고하자.

[JUnit을 사용하지 않은 단위테스트 코드]

public class StampCalculatorTestWithoutJUnit {
    public static void main(String[] args) {
        calculateStampCountTest();
    }
    
    private static void calculateStampCountTest() {
        // given
        int nowCount = 5;
        int earned = 3;
        

        // when
        int actual = StampCalculator.calculateStampCount(nowCount, earned);

        int expected = 7;

        // then
        System.out.println(expected == actual);
    }
}

주석처리 된 given - when - then 용어는 BDD테스트 방식에서 사용하는 용어이다.

가독성을 높이는데 유용한 방법이다.

  • given
    • 테스트를 위한 준비과정명시
    • 테스트에 필요한 전제조건
    • 테스트 대상에 전달되는 입력 값
  • when
    • 테스트 동작(대상)을 지정한다
    • 단위 테스트에서는 메서드 호출을 통해 테스트를 진행하기 때문에 한두줄 정도로 작성이 끝난다.
  • then
    • 테스트의 결과를 검증하는 영역이다.
    • 우리의 기대처럼 동작이 수행되는지 검증하는 코드를 작성한다. (true/false)

Assertion(어써션)

테스트 결과를 검증할 때 사용하는 용어이다.

  • '테스트 케이스의 결과가 참(true)이길 바라는 것'으로 이해하면 된다.
profile
기억을 위한 기록 :>

0개의 댓글