테스트 ?
: 어떤 대상에 대한 일정 기준을 정해놓고, 그 대상이 정해진 기준에 부합하는지, 못하는지 검증하는 과정
테스트를 하는 이유? :
테스트 대상이 검증 과정에 잘 통과하게 만들어 최대한 더 나은 결과를 얻기 위함!
특히 단위 테스트 : 결과 빠르게 확인할 수 있고, 버그 미리미리 확인 가능하다.
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));
'Spring' 카테고리의 다른 글
[Spring] 슬라이스 테스트 - API 계층, 데이터 액세스 계층 테스트 (0) | 2022.11.11 |
---|---|
[Spring] Mockito, Mock 이란? (0) | 2022.11.10 |
[Transaction] 트랜잭션이란? / 스프링 지원 - 선언형 방식 트랜잭션 (어노테이션, AOP) (0) | 2022.11.07 |
[Spring] Spring Data JDBC 적용하기 (+ H2 DB 사용하기) (0) | 2022.10.29 |
[Spring] 데이터 액세스 기술 유형(SQL 중심 / 객체 중심(ORM)) + Spring Data JDBC란? (0) | 2022.10.27 |
댓글