본문 바로가기

Spring/Test

테스트 코드와 제이유닛(JUnit)

 

 

1. JUnit이란?

자바 프로그래밍 언어용 단위 테스트 프레임워크

 

2. JUnit 5 모듈 구성

1) JUnit 플랫폼: 테스팅 프레임 워크를 구동하기 위한 런처와 테스트 엔진을 위한 API 제공

2) JUnit 주피터(Jupiter): JUnit5를 위한 테스트 API와 실행 엔진을 제공 (api 모듈 / prams 모듈 / engine 모듈 포함)

3) JUnit 빈티지(Vintage): JUnit3, JUnit4로 작성된 테스트를 JUnit5 플랫폼에서 실행하기 위한 모듈 제공

 

* build.gradle 파일을 보면 JUnit 사용을 위한 환경설정이 이미 되어 있음

 

 

2. @Test 어노테이션

테스트로 사용할 클래스를 만들고 @Test 어노테이션을 메서드에 붙이면 됨

- 테스트 클래스명은 주로 접미사로 'Test'를 붙임

- @Test 어노테이션을 붙인 메소드는 private면 안됨

 

cf) JUnit4는 @Test 어노테이션이 org.junit 패키지에 포함

 

 

3. JUnit의 Assertions클래스

 

assert method를 단정문이라고하는데
단정문이라는게 an assertive sentence라는 뜻으로 영어사전에는 나오지만, 우리말로 사전에 검색하면 안나와서 이게 뭔가 했다.
우리말로 단정은 딱 잘라서 판단하고 결정함을 나타내는 단어이고, assert의 뜻도 주장하다라는 뜻이니까
주장을 의미하는 것으로 이해하면 될 것 같다.

 

- 테스트 작성에 유용한 assertion(단정, 주장) 메서드 집합

- 값을 검증하기 위한 목적의 다양한 정적 메소드 제공

- 실패한 assertion만 기록됨

- 메서드는 직접 사용(Assert.assertEquals(...))할 수 있지만 아래 코드와 같이 정적(satic) import를 통해 참조되는 경우 더 잘 읽힘

import static org.junit.Assert.*;
    ...
    assertEquals(...);

 

4. Assert method 종류와 설명

분류 메소드 & 설명
Equals





















assertArrayEquals(byte[] expecteds, byte[] actuals)           
두 바이트 배열이 같다고 주장
assertArrayEquals(char[] expecteds, char[] actuals)
두 문자 배열이 같다고 주장
assertArrayEquals(int[] expecteds, int[] actuals)
두 int 배열이 같다고 주장
assertArrayEquals(long[] expecteds, long[] actuals)         
두 개의 긴 배열이 같다고 주장
assertArrayEquals(java.lang.Object[] expecteds, java.lang.Object[] actuals)
두 개체 배열이 같다고 주장
assertArrayEquals(short[] expecteds, short[] actuals)         
두 개의 짧은 배열이 같다고 주장
assertArrayEquals(java.lang.String message, byte[] expecteds, byte[] actuals)
두 바이트 배열이 같다고 주장
assertArrayEquals(java.lang.String message, char[] expecteds, char[] actuals)
두 문자 배열이 같다고 주장
assertArrayEquals(java.lang.String message, int[] expecteds, int[] actuals)
두 int 배열이 같다고 주장
assertArrayEquals(java.lang.String message, long[] expecteds, long[] actuals)
두 개의 long 배열이 같다고 주장
assertArrayEquals(java.lang.String message, java.lang.Object[] expecteds, java.lang.Object[] actuals)      
두 개체 배열이 같다고 주장
assertArrayEquals(java.lang.String message, short[] expecteds, short[] actuals)
두 개의 short 배열이 같다고 주장
assertEquals(double expected, double actual) Deprecated.
assertEquals
(double expected, double actual, double epsilon)사용
assertEquals(double expected, double actual, double delta)          
두 개의 double 또는 float가 양의 델타 내에서 같다고 주장
assertEquals(long expected, long actual)         
두 개의 long이 같다고 주장
assertEquals(java.lang.Object[] expecteds, java.lang.Object[] actuals) Deprecated.
assertArrayEquals 사용
assertEquals(java.lang.Object expected, java.lang.Object actual)
두 개체가 같다고 주장
assertEquals(java.lang.String message, double expected, double actual) Deprecated.    
assertEquals(String message, double expected, double actual, double epsilon) 사용
assertEquals(java.lang.String message, double expected, double actual, double delta)         
두 개의 double 또는 float가 양의 델타 내에서 같다고 주장
assertEquals(java.lang.String message, long expected, long actual)          
두 개의 long이 같다고 주장
assertEquals(java.lang.String message, java.lang.Object[] expecteds, java.lang.Object[] actuals) Deprecated.  
assertArrayEquals사용
assertEquals(java.lang.String message, java.lang.Object expected, java.lang.Object actual)
두 개체가 같다고 주장
False

assertFalse(boolean condition)
조건이 거짓임을 확인
assertFalse(java.lang.String message, boolean condition)
조건이 거짓임을 확인
Not
Null
assertNotNull(java.lang.Object object)
개체가 null이 아님을 확인
assertNotNull(java.lang.String message, java.lang.Object object)
개체가 null이 아님을 확인
Not
same
assertNotSame(java.lang.Object unexpected, java.lang.Object actual)
두 개체가 동일한 개체를 참조하지 않는다고 주장
assertNotSame(java.lang.String message, java.lang.Object unexpected, java.lang.Object actual)
두 개체가 동일한 개체를 참조하지 않는다고 주장
Null assertNull(java.lang.Object object)         
개체가 null임을 확인
assertNull(java.lang.String message, java.lang.Object object)
개체가 null임을 확인
Same assertSame(java.lang.Object expected, java.lang.Object actual)
두 개체가 동일한 개체를 참조한다고 주장
assertSame(java.lang.String message, java.lang.Object expected, java.lang.Object actual)
두 개체가 동일한 개체를 참조한다고 주장
That assertThat(java.lang.String reason, T actual, org.hamcrest.Matcher<T> matcher)
실제 값이 matcher에서 지정한 조건을 충족하는지 확인
assertThat(T actual, org.hamcrest.Matcher<T> matcher)
실제 값이 matcher에서 지정한 조건을 충족하는지 확인
True assertTrue(boolean condition)
조건이 참임을 확인
assertTrue(java.lang.String message, boolean condition)
조건이 참임을 확인
fail fail()
메시지 없이 테스트 실패
fail(java.lang.String message)
주어진 메시지로 테스트 실패

 

5. 테스트 라이프 사이클

1) JUnit의 테스트 메소드 실행 순서

  1.  테스트 메소드를 포함한 객체 생성
  2.  @BeforeEach 메소드 실행
  3.  @Test 메소드 실행
  4.  @AfterEach 메소드 실행

 

2) 실행 순서 관련 에너테이션

 

@BeforeEach

- 테스트를 실행할 때 필요한 준비 작업이 필요할 때 사용

- private이면 안됨

- ex. 테스트에 사용할 임시 파일 생성, 테스트 메소드에서 사용할 객체 생성

 

@AfterEach

- 테스트를 실행한 후에 정리할 것이 있을 때 사용

- ex. 테스트에서 사용한 임시 파일을 삭제 할 때

- private이면 안됨

 

@BeforeAll

한 클래스의 모든 테스트 메소드가 실행하기 전에 특정 작업을 수행해야 할 때 사용, 정적 메소드에 붙임

 

@AfterAll

한 클래스의 모든 테스트 메소드가 실행한 후에 특정 작업을 수행해야 할 때 사용, 정적 메소드에 붙임

 

3) 테스트 메소드 간 실행 순서 의존과 필드 공유 지양

Junit은 테스트 메소드의 실행 순서를 지정하는 방법을 제공

but 각 테스트 메소드는 독립적으로 동작해야함, 테스트 메소드 간 의존이 생기면 테스트 코드의 유지보수가 어려워짐

 

6. 추가 어노테이션

@DisplayName

- 테스트에 표시할 이름을 붙일 수 있음 (어노테이션 사용안하면 메소드명)

 

@Disabled

- 특정 테스트를 실행하지 않고 싶을 때 사용

 

 

 

 

https://junit.sourceforge.net/javadoc/org/junit/Assert.html

 

Assert (JUnit API)

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

junit.sourceforge.net