스프링부트 3 테스트 코드 공부 - JUnit과 assertJ
안녕하세요 놀이방 사장입니다.
이번 포스팅은 스프링 부트 테스트 코드에 대해 공부하겠습니다.
테스트 코드란?
작성한 코드가 의도대로 작성하고 예상치 못한 문제가 없는 지 확인하는 목적으로 작성하는 코드
테스트 코드는 test디렉터리에서 작업한다.
스프링부트3 테스트용 도구들
JUnit : 자바 프로그래밍 언어용 단위 테스트 프레임 워크
Spring Test & Spring Boot Test : 스프링 부트 애플리케이션을 위한 통합 테스트 지원
AssertJ : 검증문인 어설션을 작성하는데 사용되는 라이브러리
Hamcrest : 표현식을 이해하기 쉽게 만드는데 사용되는 Matcher라이브러리
Mockito : 테스트에 사용할 가짜 객체인 목 객체를 쉽게 만들고 괸라하고 검증할 수 있게 지원하는 테스트 프레임 워크
JSONassert : JSON용 어설션 라이브러리
JsonPath : JSON 데이터에서 특정 데이터를 선택하고 검색하기 위한 라이브러리
이 중 JUnit이랑 AssertJ를 가장 많이 사용한다.
JUnit은 자바 언어를 위한 단위테스트 프레임워크
특징
1) 테스트 방식을 구분할 수 있는 애너테이션 제공
@Test애너테이션으로 메서드를 호출할 떄마다 새 인스턴스 생성, 독립 테스트 가능
예상 결과를 검증하는 어셜션 메서드 제공
사용방법이 단순, 테스트 코드 작성시간이 적음
자동 실행, 자체 결과를 확인하고 즉각적인 피드백 제공
실제로 사용해보기
테스트 파일 밑에 JUnit.java파일을 만들고 주고
안에 코드를 작성
@DisplayName : 테스트 이름을 명시
@Test : 테스트를 수행하는 메서드
assertEquals() 메서드는 첫번째 인수는 기댓값 , 두번쨰는 실제로 검증할 값을 넣는다.
실패했을 떄 경우
JUnitCycleTest.java 코드 짜기
테스트용 메서드가 많기 때문에 JUnit의 각 테스트에 대해 객체를 만들어 독립적으로 실행하는 것을 확인
애너테이션 설명
@BeforeAll
전체 테스트를 시작하기 전에 처음으로 한번만 실행
예를 들어 디비연결하거나 테스트 환경을 초기화할 떄 사용
전체 테스트 주기에서 한 번만 호출되어야해서 static메소드를 사용
@BeforeEach
테스트 케이스를 시작하기 전에 매번 실행
예를 들어 테스트 메서드에서 사용하는 객체를 초기화하거나 테스트에 필요한 값을 미리 넣을 때 사용
각 인스턴스에 대해 메서드를 호출해야하기 때문에 static이면 안됨
@AfterAll
전체 테스트를 마치고 종료하기 전에 한번만 실행
예를 들어 디비연결 종료나 공통적으로 사용하는 자원을 해체할 떄 사용
전체 테스트 주기에서 한 번만 사용하기 떄문에 static사용
@AfterEach
각 테스트 케이스를 종료하기 전에 매번 실행
예를 들어 테스트 이후 특정 데이터를 삭제해야하는 경우 사용
애너테이션 중심으로 JUnit의 실행흐름을 보면 @BeforeEach부터 @AfterEach까지 테스트 개수만큼 반복된 결과물을 볼 수 있다.
AssertJ는 JUnit과 함께 사용해 검증문의 가독성을 확 높여주는 라이브러리이다.
앞에 코드는 테스트코드의 기댓값과 비교값을 명시하지 않으므로 비교대상이 헷갈림
AssertJ를 쓴 경우
a+b와 더한 값이 sum과 같아야한다라는 의미로 명확하게 읽힌다.
자주 사용하는 메소드들 알아보기
isEqualTo(A) | A값과 같은지 검증 |
isNotEqualTo(A) | A값과 다른지 검증 |
contains(A) | A값을 포함하는지 검증 |
doesNotContain(A) | A값을 포함하지 않는지 검증 |
startsWith(A) | 접두사가 A인지 검증 |
endsWith(A) | 접미사가 A인지 검증 |
isEmpty() | 비어있는 값인지 검증 |
isNotEmpty() | 비어있지 않는 값인지 검증 |
isPositive() | 양수인지 검증 |
isNegative() | 음수인지 검증 |
isGreaterThan(1) | 1보다 큰 값인지 검증 |
isLessThan(1) | 1보다 작은 값인지 검증 |