Junit 과 AssertJ

정유진·2023년 5월 2일
0

테스트 코드

목록 보기
1/1

Junit

 자바를 위한 단위테스트 라이브러리(오픈소스) 

즉, 단위 테스트를 쉽게 해주는 테스트용 프레임워크

org.junit

- 단정문(assert..())으로 테스트 케이스의 수행결과를 판별해 알려줌
- 어노테이션으로 테스트가 간결해지도록 지원
- 테스트 결과를 Test클래스로 남김으로써 테스트 history를 저장 가능

Junit의 assert 메소드들

- 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도 있긴 있음.

Junit의 어노테이션

@Test :
	메소드 위에 해당 어노테이션을 선언해, 테스트 대상 메소드임을 지정가능

@Test(timeout=밀리초) :
	테스트 메소드 수행시간 제한 가능
    테스트 메소드가 리턴값을 반환하는 데 걸리는 시간이 지정된 밀리초를 넘긴다면 해당 테스트는 실패로 판별

@Test(expected=예외) :
	해당 테스트 메소드 예외 발생 여부에 따라 성공/실패를 판별가능
    expected=에 지정된 예외가 발생해야 테스트가 성공한 것으로 판별

@Ignore :
	해당 어노테이션이 선언된 테스트 메소드를 실행하지 않도록 지정

@BeforeEach == (구)@Before :
	모든 @Test메소드가 실행되기 전에 실행되는 메서드를 지정하는 어노테이션
    	- 각 테스트 시작 전에 각각 호출
        - @Test메서드에서 공통으로 사용되는 코드를 @Before메서드에 선언해 사용하면 좋음
        - 테스트마다 공통으로 쓰이면서, 테스트 전에 리셋되어야 할 항목이 들어감
        
@AfterEach == (구)@After :
 	모든 @Test메소드의 실행이 끝난 뒤에 실행되는 메소드를 지정하는 어노테이션
    	- 각 테스트가 끝나고 각각 호출
        
@BeforeAll == (구)@BeforeClass :
 	해당 테스트 클래스가 실행될 때 딱 한번만 수행되는 테스트 메소드를 지정하는 어노테이션
   
@AfterAll == (구)@afterClass
  	해당 테스트 클래스가 실행이 끝난 뒤에 딱 한번만 수행되는 테스트 메소드를 지정하는 어노테이션
    	- 테스트 클래스의 모든 테스트가 완료된 뒤 한번 호출됨
        

AssertJ

자바 JUnit의 테스트 코드로 사용되어, 테스트코드의 가독성과 편의성을 높여주는 라이브러리
	- 메서드 체이닝을 지원해 더 직관적이고 읽기 쉬운 테스트코드 작성 가능
    - 테스트에 필요한 풍부한 메소드들을 제공

AssertJ 메소드 임포트

import static org.assertj.core.api.Assertions.*;
import org.junit.jupiter.api.Test;
-> static import를 통해서 AssertJ의 다양한 API를 클래스 이름없이 사용 가능

AssertJ의 assert메서드 (형식)

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와 같음
  • 오프셋 : 일반적으로 동일 오브젝트 안에서 오브젝트 처음부터 주어진 요소나 지점까지의 변위치를 나타내는 정수형 ex) 문자 A의 배열이 abcdef포함 -> 'c' 문자는 A 시작점에서 2의 오프셋을 지님

AssertJ의 메서드들 (org.assertj.core.api 패키지의 메서드들 중심)

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()

※ AssertJ 사용 시 주의점

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)

출처 : https://bibi6666667.tistory.com/231

profile
개발자 준비중입니다.

0개의 댓글