본문 바로가기
Spring

[Spring] 스프링 테스팅(Testing) 中 단위 테스트 - JUnit, Hamcrest

by jungha_k 2022. 11. 10.

테스트 ?

: 어떤 대상에 대한 일정 기준을 정해놓고, 그 대상이 정해진 기준에 부합하는지, 못하는지 검증하는 과정

 

테스트를 하는 이유? :

테스트 대상이 검증 과정에 잘 통과하게 만들어 최대한 더 나은 결과를 얻기 위함!

특히 단위 테스트 : 결과 빠르게 확인할 수 있고, 버그 미리미리 확인 가능하다.

 

ex) Postman 통해서 돌려보는 것, 디버깅 ...

 


테스트의 종류 : (⬇ 범위 좁아짐)

 

- 기능 테스트 : 

범위가 제일 큼, 사용자 입장(제 3자)에서 애플리케이션 기능 동작 테스트

QA 부서가 실시, API 툴, 데이터베이스 모두 연관

 

 

- 통합테스트 : 

개발팀, 개발자가 테스트의 주체

클라이언트 툴 없이 테스트 코드 실행으로 이루어짐

여러 계층 연관되어 있음 - 독립적 테스트 불가

 

 

- 슬라이스 테스트 : 

애플리케이션을 특정 계층으로 쪼개어서 테스트

(API, 서비스, 데이터 액세스 계층)

 

 

: db 사용 여부에 따라 갈림 (but db 상태 테스팅 전후로 동일하다면 db연동해도 단위 테스트 될 수 있다!)

 

 

- 단위 테스트 : 

주로 메서드 단위로 작성됨

핵심 로직(=비즈니스 로직) 에서 사용하는 클래스들 ➡ 독립적으로 테스트 굿


단위 테스트를 위한 F.I.R.S.T 원칙

  • Fast : 빠르게
    각각의 테스트 케이스는 빠르게 돌린다

  • Independent : 독립적으로
    각각의 테스트 케이스는 독립적이어야 한다

  • Repeatable : 반복 가능하도록
    어떤 상황에서도 테스트 케이스는 반복해서 실행 가능하다

  • Self-validating : 셀프 검증이 되도록
    자체적으로 검증 결과(성공, 실패) 보여주어야 한다
  • Timely : 시기 적절하게 
    기능 구현을 하기 직전에 작성해야 한다
    기능 업그레이드 + 테스트 케이스 업그레이드 동시에! 

JUnit ?

: Java의 표준 테스트 프레임 워크

 

import org.junit.jupiter.api.Test;

public class JunitDefaultStructure {
		// (1)
    @Test
    public void test1() {
        // 테스트 하고자 하는 대상에 대한 테스트 로직 작성
    }

		// (2)
    @Test
    public void test2() {
        // 테스트 하고자 하는 대상에 대한 테스트 로직 작성
    }

		// (3)
    @Test
    public void test3() {
        // 테스트 하고자 하는 대상에 대한 테스트 로직 작성
    }
}

 

 

Junit 사용한 테스트케이스의 기본 구조

: @Test 에 하나의 테스트케이스가 작성된다! 

 


Assertion 메서드

= 예상하는 결과 값이 참(true)이길 바라는 논리적인 표현, '검증한다'

 

 

- assertEquals(예상값, 실제값);

: 두 값이 같은지 검증

 

 

- assertNotNull(테스트 대상 객체, "테스트 실패시 표시 메세지")

: Null 여부 테스트

 

 

- assertThrows(발생이 기대되는 예외 클래스, () -> 테스트 대상 메서드 호출)

: 예상한 예외 클래스 발생시 pass

* 예외 클래스 상속 관계 이해하고 쓸 것!

 


@BeforeEach() : 각각의 테스트 케이스 실행 직전에 먼저 실행됨 (초기화 작업등..)

@BeforeAll() : 클래스 레벨에서 테스트 한꺼번에 실행시, 테스트 케이스 실행 전에 딱 한번 초기화 작업 가능

* 정적 메서드에만 추가될 수 있다!

 

+

@AfterEach

@AfterAll

 


Assumption : ~라고 가정하다

 

assumeTrue() : 파라미터 값이 true 이면 로직 실행

* 특정 조건에서 선택적인 테스트 실행시..

 


Hamcrest 란?

: Junit 기반의 단위테스트에서 사용할 수 있는 Assertion Framework

 

 

특징 

- Assertion 을 위한 매쳐(Matcher) 가 자연스러운 문장이다 ~ 가독성 향상

- 테스트 실패 메세지 이해 쉽다

- 다양한 Matcher 제공된다

 

 

ex) JUnit ↔ Hamcrest

//ex 1.

//JUnit Assertion
assertEquals(exected, actual);

//Hamcrest Matcher
assertThat(actual, is(equalTo(expected));

 

//ex 2.

//JUnit Assertion
assertNotNull(something, "should be not null");

//Hamcrest Matcher
assertThat(something, is(notNullValue()));
assertThat(something, is(NullValue()));

 

//ex 3.

//JUnit Assertion
assertThrows(NullPointerException.class, () -> getSomething("STH"));

//Hamcrest Matcher
Throwable actualException = assertThrows(NullPointerException.class,
                () -> getSomething("STH"));
assertThat(actualException.getCause(), is(equalTo(null));

댓글