자바를 위한 단위테스트 라이브러리(오픈소스)
즉, 단위 테스트를 쉽게 해주는 테스트용 프레임워크
- 단정문(assert..())으로 테스트 케이스의 수행결과를 판별해 알려줌
- 어노테이션으로 테스트가 간결해지도록 지원
- 테스트 결과를 Test클래스로 남김으로써 테스트 history를 저장 가능
- assertEquals(A,B) : 객체 A, B가 같은 값을 가지는지 확인
- assertEquals(A, B, C) : 객체 A와 B가 같은 값을 가지는지 확인 (C는 오차범위)
- assertArrayEquals(A, B) : 배열 A, B가 일치하는지 확인
- assertSame(A, B) : 객체 A와 B가 같은 객체인지 확인
- assertTrue(A) : 조건 A가 참인지 확인
- assertNull(A) : 객체 A가 Null인지 확인
- assertNotNull(A) : 객체A가 Null인지 아닌지 확인
※ assertThat도 있긴 있음.
@Test :
메소드 위에 해당 어노테이션을 선언해, 테스트 대상 메소드임을 지정가능
@Test(timeout=밀리초) :
테스트 메소드 수행시간 제한 가능
테스트 메소드가 리턴값을 반환하는 데 걸리는 시간이 지정된 밀리초를 넘긴다면 해당 테스트는 실패로 판별
@Test(expected=예외) :
해당 테스트 메소드 예외 발생 여부에 따라 성공/실패를 판별가능
expected=에 지정된 예외가 발생해야 테스트가 성공한 것으로 판별
@Ignore :
해당 어노테이션이 선언된 테스트 메소드를 실행하지 않도록 지정
@BeforeEach == (구)@Before :
모든 @Test메소드가 실행되기 전에 실행되는 메서드를 지정하는 어노테이션
- 각 테스트 시작 전에 각각 호출
- @Test메서드에서 공통으로 사용되는 코드를 @Before메서드에 선언해 사용하면 좋음
- 테스트마다 공통으로 쓰이면서, 테스트 전에 리셋되어야 할 항목이 들어감
@AfterEach == (구)@After :
모든 @Test메소드의 실행이 끝난 뒤에 실행되는 메소드를 지정하는 어노테이션
- 각 테스트가 끝나고 각각 호출
@BeforeAll == (구)@BeforeClass :
해당 테스트 클래스가 실행될 때 딱 한번만 수행되는 테스트 메소드를 지정하는 어노테이션
@AfterAll == (구)@afterClass
해당 테스트 클래스가 실행이 끝난 뒤에 딱 한번만 수행되는 테스트 메소드를 지정하는 어노테이션
- 테스트 클래스의 모든 테스트가 완료된 뒤 한번 호출됨
자바 JUnit의 테스트 코드로 사용되어, 테스트코드의 가독성과 편의성을 높여주는 라이브러리
- 메서드 체이닝을 지원해 더 직관적이고 읽기 쉬운 테스트코드 작성 가능
- 테스트에 필요한 풍부한 메소드들을 제공
import static org.assertj.core.api.Assertions.*;
import org.junit.jupiter.api.Test;
-> static import를 통해서 AssertJ의 다양한 API를 클래스 이름없이 사용 가능
AssertJ에서 모든 테스트 코드는 assertThat()으로 시작
assertThat(테스트 타겟).메서드1().메서드2().메서드3()
(=assertThat(T actual, Matcher<? super T> matcher))
-> 이런 format으로 AssertJ의 여러 메서드들을 연쇄적으로 호출해 코드 작성가능(메서드 체이닝)
예시)문자열
assertThat("Hello, world! Nice to meet you.") // 주어진 문자열에서
.isNotEmpty() // 비어있지 않고
.contains("Nice") // "Nice"를 포함하고
.contains("world") // "world"도 포함하고
.doesNotContain("ZZZ") // "ZZZ"는 포함하지 않으며
.startWith("Hell") // "Hell"로 시작하고
.endsWith("u.") // "u."로 끝나며
.isEqualTo("Hello,world! Nice to meet you."); //해당 문자열과 일치
예시)숫자
assertThat(3.14d) // 주어진 숫자에서
.isPosition() // 양수이고
.isGreaterThan(3) // 3보다 크며
.isLessThan(4) // 4보다 작고
.isEqualTO(3, offset(1d) // 오프셋 1기준으로 3과 같고
.isEqualTO(3.1, offset(0.1d)// 오프셋 0.1기준으로 3.1과 같으며
.isEqualTO(3.14); // 오프셋 없이는 3.14와 같음
1.일반
Assert 인터페이스 : 모든 Assertion객체가 기본적으로 제공
isEqualTo(Object o) : 실제 값이 주어진 값과 같은지 확인
isNotEqualTo(Object o) : 실제 값이 주어진 값과 같지 않은지 확인
isInstanceOf(Class<?> type),isInstanceOfAny(Class<?>...types)
: 실제값이 주어진 유형의 인스턴스인지 확인
<-> isNotInstanceOf(Class<?> type), isNotInstanceOfAny(Class<?> ...types)
isExactSameInstanceOf(Class<?> type) : 실제값이 정확히 주어진 유형의 인스턴스인지 확인
<-> isNotExactSameInstanceOf(Class<?> type)
asList() : 실제 값이 List의 인스턴스인지 확인하고 list Assertion을 반환
asString() : toString()으로 실제 값에 대한 문자열을 반환
hasSameClassAs(Object o) <-> doesNotHaveSameClassAs(Object o)
hasSameHashCodeAs(Object o) <-> doesNotHaveSameHashCodeAs(Object o)
: 실제 값/ 객체가 주어진 객체와 동일한 클래스/해시코드를 가지고 있는지 확인
hasToString(String str <->, doesNotHaveToString(String str)
: 실제 actual.toString()값이 주어진 String과 같은지 확인
isIn(Iterable<?> v) , isIn(object ...v)
: 주어진 iterable 또는 값 배열에 실제 값이 있는지 확인
<-> isNotIn(Iterable<?> v) <-> isNotIn(object ...v)
isNull() : 실제값이 null인지 확인
<-> isNotNull()
isSameAs(Object o) : == 비교를 사용해 실제 값이 주어진 값과 동일한지 확인
<-> isNotSameAs(Object o)
그 외,
as("설명") : Assertion을 설명하는 메서드 -> 설명의 내용이 테스트 결과에 출력가능
2. 숫자 관련 메서드
NumberAssert 인터페이스
isBetween(start, end)
: 실제 값이 start에서 end값 사이에 있는지 확인함 (start, end값을 포함)
3. 부동소수점 숫자 관련 메서드
floatingPointNumberAssert 인터페이스
isNaN() : 실제값이 NaN과 같은지 확인
<-> isNotNaN()
isFinite()
isInfinite()
1. assertThat(Object o)로 테스트할 객체를 호출한 다음 메서드들을 사용해야 함
예시> assertThat(actual).isEqualTo(expected); (O)
assertThat(actual.equals(expected)); (X)
assertThat(1).isEqualTo(2); (O)
assertThat(1 == 2); (X)
2. as()는 assertion 메소드들을 호출하기 전에 사용해야 함
예시> assertThat(actual).as("description").isEqualTo(expented);
assertThat(actual).describedAs("description").isEqualTo(expented); (O)
assertThat(actual).isEqualTo(expented).as("description");
assertThat(actual).isEqualTo(expented).describedAs("description"); (X)