반갑습니다!

[JUnit 5] JUnit 5 - 1 본문

개발

[JUnit 5] JUnit 5 - 1

김덜덜이 2020. 12. 27. 22:41

테스트를 작성하는 자바 개발자 90% 이상이 사용하는 JUnit에 대해서 알아보도록 하자.

해당 포스트에서는 가장 최신 버전인 JUnit 5를 기준으로 한다.

구조

우선 JUnit 5가 어떻게 구현되어있는지 간단하게 알아보자.

JUnit 5는 이전 버전의 JUnit들과 다르게 여러 개의 모듈로 구성되어있다.

공식 가이드에서는 JUnit 5를 다음과 설명한다.

JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage

즉, JUnit 5는 JUnit Platform과 JUnit Jupiter, JUnit Vintage라는 3개의 모듈로 구성되어 있다.

JUnit Platform

JUnit Platform은 JVM 환경에서 테스트 프레임워크를 시작할 수 있는 기초 역할을 한다. 그리고 테스트를 실행해주는 Launcher를 제공한다. 이 Launcher를 통해 콘솔에서도 테스트가 가능하다. 또한 테스트 프레임워크 개발을 위한 TestEngine API를 제공해준다.

JUnit Jupiter

JUnit Jupiter는 TestEngine API의 구현체로 JUnit 5를 제공한다.

JUnit Vintage

JUnit Vintage는 Junit 3와 Junit 4를 지원해주는 TestEngine API의 구현체이다.

시작하기

@Test

정수 덧셈 기능을 구현한 계산기를 통해 간단한 테스트를 진행해보자.

정수 덧셈만 가능한 아주 간단한 계산기 코드이다.

이번에는 테스트 코드를 작성해보자.

JUnit 5에서는 @Test 가 있는 메소드를 실행시킴으로써 테스트를 진행한다.

실행 결과

위 코드는 Calculator 객체를 생성시키고, 객체가 null이 아니면 통과하는 아주 간단한 테스트이다. 위 코드에서 @Test 가 있는 createCalculatorTest() 함수가 실행되었고, assertNotNull() 함수를 사용해서 calculator 객체가 null 인지 아닌지 확인했음을 주목하자.

assertNotNull() 와 같이 JUnit 5에서는 Assertions 클래스 안에 구현된 다양한 함수를 제공함으로써 테스트 코드를 쉽게 작성할 수 있도록 도와준다.

@Before / After

테스트 코드를 작성하다보면 테스트 전 후로 값 또는 객체를 초기화하는 등의 작업이 필요할 수 있다. 이를 위해 JUnit 5에서는 4개의 Annotaion을 제공한다.

  • @BeforeAll
  • @AfterAll
  • @BeforeEach
  • @AfterEach

여기서 @BeforeAll / @AfterAll@BeforeEach / @AfterEach 가 각각 짝지어지는데, 우선 All Annotaion부터 알아보자.

@BeforeAll / @AfterAll

이 2개의 Annotation은 메소드 위에 선언되며, @BeforeAll가 선언된 메소드는 테스트 시작 전, @AfterAll 가 선언된 메소드는 테스트 종료 후 1번 호출된다. 이 때 유의해야할 점은 **@BeforeAll, @AfterAll을 선언할 메소드는 static 메소드여야 한다.**

직접 테스트 코드를 작성하며 알아보자.

실행결과

테스트가 무사히 통과되고, BeforeAll()는 테스트 시작 전에, AfterAll()는 테스트 종료 후에 1번씩 호출됨을 알 수 있다.

@BeforeEach / @AfterEach

@BeforeEach, @AfterEach 역시 메소드 위에 선언되어야 하는 것은 동일하지만, 이번엔 static 메소드일 필요는 없다. 그리고 All과는 다르게 각 테스트 전, 후로 호출된다는 특징이 있다.

실행결과

역시 테스트가 무사히 통과되고, BeforeEach()는 각각의 테스트 시작 전에, AfterEach()는 각각의 테스트 종료 후에 호출됨을 알 수 있다.

@Disabled

테스트 코드를 작성했지만, 여러 가지의 이유로 테스트에서 제외하고 싶은 경우가 생길 수 있다. 이럴 땐 제외하고 싶은 메소드 위에 @Disabled를 선언해주기만 하면 된다.

실행결과

@Disabled를 선언한 addTest()가 테스트에서 제외되었음을 알 수 있다.

'개발' 카테고리의 다른 글

[Effective Java] 아이템 1: 생성자 대신 정적 팩터리 메서드를 고려하라  (0) 2021.07.22
[JUnit 5] JUnit 5 - 2  (0) 2020.12.28
[Java] Java Reference  (0) 2020.10.15
[Java] Garbage Collection  (0) 2020.10.15
[UML] Class Diagram  (0) 2020.06.22