본문 바로가기
Spring

Spring - JUnit5을 이용한 단위 테스트 (기본 어노테이션 및 AssertJ)

by devLog by Ronnie's 2021. 8. 1.

Spring - JUnit5 기본 테스트 어노테이션

 

JUnit5의 단위테스트 방법과 어노테이션 및 assert메서드를 정리한다.

 

JUnit5?

자바용 단위테스트 프레임워크이다.

5는 버전을 의미하며 4버전에서 5버전으로 바뀌며 접근제한자가 public에서 Default여도 되게 바뀌었다.

 

단위테스트?

작성한 소스코드가 의도한 대로 정확히 동작하는지 검증하는 절차를 말한다.

모든 메서드에 대한 테스트 케이스를 작성하고 검증한다.

 

테스트 방법

테스트 클래스를 만들어 해당 테스트 메서드에 @Test어노테이션을 붙여준다.

그리고 테스트 코드를 작성할때 given-when-then 패턴을 사용하면 테스트코드 작성시 많은 도움이 된다.

given - 테스트에서 구체화하고자 하는 행동을 시작하기 전에 테스트 상태를 설명하는 부분

when - 구체화하고자 하는 그 행동

then - 어떤 특정한 행동 때문에 발생할거라고 예상되는 변화에 대한 설명

 JUnit과 같이 쓰기 좋은 AssertJ라는 오픈소스 라이브러리를 사용하였다. AssertJ는 자바 테스트를 위해 좀 더 풍부한 문법을 제공하며 메서드 체이닝을 통해 직관적인 테스트 흐름 작성을 도와준다.

 

JUnit에서 제공하는 assert메서드는 assertEquals(x, y)와 같이 두개의 인자를 받아서 비교하므로 기대값과 실제값의 혼동이 있을 수 있지만 AssertJ는 체이닝을 통해 가독성이 좋다.

 

import시 assert메서드와 혼동을 주의한다. assertj가 표시된 Assertions를 import한다.

 

JUnit 어노테이션

@Test

메소드 위에 해당 어노테이션을 선언해, 테스트 대상 메소드임을 지정할 수 있다.

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

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

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

@BeforeEach == (구)@Before
모든 @Test메소드가 실행되기 전에 실행되는 메소드를 지정하는 어노테이션이다.

각 테스트 시작 전에 각각 호출된다.

@Test메서드에서 공통으로 사용되는 코드를 @Before메서드에 선언해 사용하면 좋다.

테스트마다 공통으로 쓰이면서, 테스트 전에 리셋되어야 할 항목이 들어간다

@AfterEach == (구)@After
모든 @Test메소드의 실행이 끝난 뒤에 실행되는 메소드를 지정하는 어노테이션이다.

각 테스트가 끝나고 각각 호출된다.

@BeforeAll == (구)@BeforeClass
해당 테스트 클래스가 실행될 때 딱 한 번만 수행되는 테스트 메소드를 지정하는 어노테이션이다.

@AfterAll == (구)@AfterClass

해당 테스트 클래스가 실행이 끝난 뒤에 딱 한 번만 수행되는 테스트 메소드를 지정하는 어노테이션이다.테스트클래스의 모든 테스트가 완료된 뒤 한 번 호출된다.

 

 

AssertJ 메서드

AssertJ에서 모든 테스트 코드는 assertThat()으로 시작하며, assertThat(test target).메서드1().메서드2()... 으로 사용한다.

아래에 두가지 예제를 통해 메서드를 정리한다.

assertThat("Hello, world! Nice to meet you.") // 주어진 "Hello, world! Nice to meet you."라는 문자열은
                .isNotEmpty() // 비어있지 않고
                .contains("Nice") // "Nice"를 포함하고
                .contains("world") // "world"도 포함하고
                .doesNotContain("ZZZ") // "ZZZ"는 포함하지 않으며
                .startsWith("Hell") // "Hell"로 시작하고
                .endsWith("u.") // "u."로 끝나며
                .isEqualTo("Hello, world! Nice to meet you."); // "Hello, world! Nice to meet you."과 일치한다.
assertThat(3.14d) // 주어진 3.14라는 숫자는
                .isPositive() // 양수이고
                .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와 같다

 

 

 

 

 

댓글