본문 바로가기
IT 이야기/Java

[Java] JUnit5

by Dblog 2020. 12. 6.
728x90

https://junit.org/junit5/

 

JUnit 5

Société Générale Use, Contribute and Attract: learn about Société Générale's open source strategy.

junit.org

 

JUnit

자바의 소스를 테스트할때 가장 많이 사용하는 프레임 워크입니다.

Java + Test = JUnit 

 

오랜 기간 Junit4를 사용해 왔지만 테스트 환경이 고도화 되고 많은 확장성을 요구하게 되면서 불편함이 발견되기 시작했습니다.

  • 강한 결합도
  • 부족한 확장성
  • 많은 책임

IDE와 build툴에 강한 결합도, 하나의 @Runwith만 선언할 수 있는 제약, jar 하나에 부여되는 많은 책임이 부여되는 불편함이 생기기 시작했습니다.

불편함이 하나 둘 생기면서 개발자가 테스트코드를 작성할때 고려해야 할 사항들이 많아져 라이브러리 개선의 요구사항이 생기면서 JUnit5의 개발이 시작되었습니다.

  • JUnit4 의 최근 릴리즈가 10년전
  • 더이상 JUnit4 릴리즈 계획이 없음

(if kakao 컨퍼런스 캡쳐)

이 사진은 JUnit5개발 시작을 위해 모인 Lambda 팀원들 입니다.

Gradle, InteliJ, .. 등 각 위치에서 활동중인 뛰어난 개발자들이 모여 개발에 필요한 돈 펀딩을 시작하면서 프로젝트가 시작되었습니다.

 

JUnit5

 

구조

JUnit5는

JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage 

형태를 가지게 되는데 플렛폼 위에서 모듈이 실행되는 구조입니다.

위의 구조를 시작으로 JUnit5는 
플랫폼이 Vintage, Jupiter, 3rd Party를 담당하고, 
Launcher가 Build tools, IDE를 관리하는 방식으로 부담을 나누게 됩니다.

 

Junit5는 프로젝트 시작 당시 두가지 중점을 가지고 시작했습니다.

단순/확장성을 고려하기 위해 기존 구조를 통합하거나 제약이 있던 부분들을 분리한 부분이 상당 부분 있습니다.

 

 

변경사항

Java Version

JUnit4 = java 5이상
JUnit4 = java 8 이상

 

Annotations

JUnit 4 JUnit 5
@Test @Test
@BeforeClass @BeforeAll
@AfterClass @AfterAll
@Before @BeforeEach
@After @AfterEach
@Ignore @Disable
@Category @Tag
  @Nested
  @TestFactory
  @ExtendWith

 

 

최대한 단순하게 사용하기 위해 기존에 public으로 선언해야 했던 Test 함수들이 public없이 사용 가능하게 바뀌었습니다.

//JUnit4
@Test
public void test() {
	system.out.println("junit4");
}
//JUnit5
@Test
void test() {
	system.out.println("junit5");
}

 

기존 Runner, MethodRule, TestRule로  나누어져있던 모듈을 Extension하나로 통합했으며
@ExtendWith, @RegisterExtension, Java의 ServiceLoader를 통해 등록할 수 있습니다.

 

 

추가된 기술

assertAll

assertAll로 선언된 여러개의 assert는 중간에 실패가 발생해도 모든 assert문을 실행하고 결과를 반환 합니다.
exction을 반환 받을 수 있으며 이를 통해 검증을 진행할 수 있습니다. 또한 assert에서 timeout을 설정할 수 있습니다.

@Test
void assertAllTEST() {
	assertAll("String assert Case Test", 
    					() -> assertEquals("test1" , name.toLowerCase()),
    					() -> assertEquals("test2" , name.toUpperCase())
	);
    
}
@Test
void assertThrowsTEST() {
	Exception except = assertThrows (
    						ArithmeticException.class, () -> calculator.divide(1,0)
    					);
                        assertEquals(" / by zero", excetion.getMessage());
}

 

DisplayName

기존의 사용법을 유지하며, 한글, 스페이스, 이모지, 특수문자를 선언할 수 있습니다.
Nested의 설정도 가능합니다.

@DisplayName("한글이 가능합니다.")
public class DisplayTest {
	
    @DisplayName("★ 특수 문자도 가능★")
    @Test
    void t1() {
    	system.out.println("t1");
    }
    
    @Nested
    @DisplayName("★ nested도 가능★")
    class n1() {
    	system.out.println("n1");
        
        @Nested
    	@DisplayName("★ nested2도 가능★")
        class n1_n2() {
        	system.out.println("nn2");
        }
    }

	
}

 

 

 

reference

ifkakao(2020) : https://if.kakao.com/session/108
728x90

댓글