조종 다음은 개발
article thumbnail

1 주차 미션을 마무리하고 다른 분들의 코드를 리뷰하면서 테스트 코드에서 다양한 기능을 제공한다는 것을 배울 수 있었다. 그래서 이번 기회에 어떠한 기능들을 제공하는지 정리해보려고 한다.

JUnit 과 AssertJ

테스트 코드를 작성할 때 우리는 JUnit 과 AssertJ 에서 제공하는 기능 둘 다 사용한다.
그렇기에 우선 JUnit 과 AssertJ 에 대해서 알아보자.

  • JUnit : 자바에 구축된 자동화 테스트가 가능한 프레임워크
  • AssertJ : 자바 테스트에서 유창하고 풍부한 assertions를 작성하는 데 사용되는 오픈소스 라이브러리

어떻게 사용하는데? 생각할 수 있으니까 우선 간단한 예시를 보자.

@Test 와 같은 애노테이션은 JUnit 에서 제공하고, assertThat 과 같은 테스트 코드를 AssertJ에서 제공한다.

🤔 뭐하러 둘로 나눴어 하나로 만들지

그렇다면 왜 두 가지로 나눠서 제공할까? 하나로 제공하면 안 될까?

사실 JUnit 에서는 @Test 와 같은 애노테이션뿐만 아니라 실제로 테스트 코드 API 도 제공한다.

그런데 강의를 듣거나 다른 사람들의 코드를 보면 대부분 AssertJ 를 사용한다.

심지어 JUnit5 공식 문서에서 까지 서드 파티 라이브러리인 AssertJ 의 사용을 권장하고 있다.

왜 다들 JUnit 에서 제공하는 코드가 아닌 AssertJ 를 사용할까?

이에 대한 설명은 잘 설명되어 있는 글이 있어서 링크로 소개하겠다.

이후 이어지는 글에서는 AssertJ 의 기능에 대한 설명은 생략하겠다.

AssertJ를 사용하는 이유

 

AssertJ를 사용하는 이유

IntelliJ에서 테스트코드를 작성할 때, Assertions 키워드를 작성하면 자동완성 기능으로 두 가지를 추천해준다. 하나는 org.junit.jupiter.api.Assertions이고, 하나는 org.assertj.core.api.Assertions이다. 강의를 듣

xxeol.tistory.com

AssertJ vs. JUnit

 

AssertJ vs. JUnit

스터디에서 대니스가 말씀해주시길, JUnit 내에 있는 Assertions보다는 AssertJ를 많이 사용한다고 말씀해주셨다. 그래서 이번엔 이 두 개의 차이점을 정리해보려고 한다. 해당 내용은 다음 링크를 번

kkoon9.tistory.com

JUnit 이 제공하는 기능

그러면 이제 JUnit 이 제공하는 기능들에 대해 알아보자. 사실 모든 기능들은 공식 문서에 잘 설명되어 있다.

그래서 여기에서는 자주 사용하는 애노테이션들에 대해서만 설명하겠다.

@Test

가장 기본적인 애노테이션이다. 해당 애노테이션이 붙은 메서드는 테스트 메서드임을 선언한다.

해당 애노테이션이 있어야 테스트를 돌릴 수 있다.

@DisplayName

테스트 클래스 or 메소드의 사용자 정의 이름 선언하는 기능이다.

만약 해당 애노태이션이 없다면 테스트 이름은 메서드 이름으로 정의된다.

@BeforeEach, @AfterEach

  • @BeforeEach 는 모든 테스트 실행 전에 실행할 메서드를 지정해 준다.
  • @BeforeEach 가 붙은 메서드는 각각의 테스트가 실행되기 이전에 호출된다.
  • @AfterEach 도 있는데, 이 애노테이션이 붙은 메서드는 각각의 테스트가 실행된 이후에 호출된다.

@BeforeAll, @AfterAll

  • @BeforeAll현재 클래스 실행 전 제일 먼저 실행할 메서드를 지정해 준다.
  • 모든 테스트가 실행되기 이전에 한 번 실행된다. 해당 메서드는 static 으로 선언되어야 한다.
  • @AfterAll현재 클래스의 모든 테스트가 수행된 이후에 실행될 메서드를 지정해준다.

@ParameterizedTest

매개변수를 받는 테스트를 작성할 때 @Test 대신 사용한다.

주로 @ValueSource , @MethodSource 등 과 같이 사용된다. 예시는 아래에서 설명하겠다.

@ValueSource

  • 하나의 매개변수를 통해 여러 값을 테스트하고 싶을 때 사용한다.
  • @ValueSource 의 소괄호 () 안에 ints , strings , bytes 등등 어떤 타입을 사용할 것인지 선언해 준 다음에 사용할 테스트들을 중괄호 {} 로 건네주면 된다.
  • 리터럴 값만 테스트할 수 있다.
  • @ValueSource 는 하나의 값만 사용할 수 있다. 여러 값을 가지고 테스트하기 위해서는 @MethodSource 를 활용해야 한다.

@MethodSource

  • 두 가지 이상의 매개변수를 통해 여러 값을 테스트하고 싶을 때 사용한다.
  • 테스트할 파라미터를 Stream<Arguments> 로 넘겨준다. 그 후 @MethodSource 애노테이션 괄호 안에 해당 메서드 이름을 넣어주면 된다.
  • 리터럴값뿐만 아니라 List 와 같은 객체도 넘겨줄 수 있다.

 

@ParameterizedTest 각각의 이름 부여하기

원래 이전에는 테스트를 하면 테스트케이스에 대해선 어떤 요소가 들어가는지만 나왔다.

 

그런데 @ParameterizedTest 안에 메시지를 넣어주면 케이스에 맞는 메시지를 출력해 줄 수 있다.

 

어떤 요소들이 들어갈 수 있는지는 위 표에서 확인 가능하다.

 

🌐 Reference

AssertJ vs. JUnit

 

AssertJ vs. JUnit

스터디에서 대니스가 말씀해주시길, JUnit 내에 있는 Assertions보다는 AssertJ를 많이 사용한다고 말씀해주셨다. 그래서 이번엔 이 두 개의 차이점을 정리해보려고 한다. 해당 내용은 다음 링크를 번

kkoon9.tistory.com

[JUnit5] JUnit5 구성, 어노테이션, Assertions 정리

 

[JUnit5] JUnit5 구성, 어노테이션, Assertions 정리

JAVA 8 버전부터 사용 가능참고 사이트 https://steady-coding.tistory.com/349JUnit5는 JUnit Platform, JUnit Jupiter, JUnit Vintage가 결합한 형태JUnit PlatformJVM에서 테스트

velog.io

[JUnit] JUnit5 사용법 - 기본 - Heee's Development Blog

 

[JUnit] JUnit5 사용법 - 기본 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

https://programmer-ririhan.tistory.com/391

 

@ParameterizedTest에도 각각의 이름을 부여할 수 있다??

로또 미션 2단계 코드 리뷰에서 다음과 같은 리뷰를 받았다. 처음에는 진짜 띠용?? 이었다. 😨 이걸 어떻게 검색해봐야하지..? 하는 고민이 들었었다. 그러다 크루들과 로또 미션 코드 회고를 할

programmer-ririhan.tistory.com

 

profile

조종 다음은 개발

@타칸

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!