Search
Duplicate
⚗️

JUnit5란?

자바를 위한 단위 테스트 프레임워크다.
JUnit Platform, JUnit Jupiter, JUnit Vintage가 결합한 형태다.
JUnit Platform
테스트 프레임워크를 실행하는 데 기반이 되는 모듈이다.
플랫폼에서 동작하는 테스트 프레임워크 개발을 위한 API를 제공한다.
커맨드 라인에서 콘솔 런쳐와 JUnit4 기반 환경의 플랫폼에서 실행하기 위한 JUnit4 기반의 Runner를 제공한다.
각종 IDE 및 빌드 도구에 존재한다.
JUnit Jupiter
테스트를 위한 새로운 프로그래밍 모델과 확장 모델의 조합이다.
주피터의 하위 프로젝트는 플랫폼에서 동작을 위한 TestEngine을 제공한다.
JUnit Vintage
하위 버전을 실행할 수 있는 TestEngine을 제공한다.
Jupiter EnginePlatform Runner 의존성이 필요하다.

특징

테스틀 작성하고 실행할 때, 사용하는 오픈소스 프레임워크다.
annotation을 제공한다.
테스트 결과를 확인하기 위한 assertion을 제공한다.
test runner를 제공한다.
코드의 품질을 개선하고 유지보수하기 쉽게 해준다.
자동으로 테스트할 수 있으며 자체의 결과를 확인하고 바로 제공한다.
테스트 케이스 및 기타 테스트 suites를 포함하는 test suites로 구성된다.

단위 테스트는 왜 할까?

작성한 메소드가 의도한대로 동작하는지 확인한다.
피드백을 빠르게 받아 부분적으로 빠르게 기능을 완성하기 위함이다.
기능 별로 최소한 두 개의 단위 테스트 케이스는 있어야 한다. 긍정, 부정

어노테이션

내용
JUnit4 어노테이션
@Test
해당 MethodTest임을 명시한다.
@Test
@ParameterizedTest
매개변수를 받는 테스트를 작성할 수 있다.
@RepeatedTest
반복되는 테스트를 작성할 수 있다.
@TestFactory
@Test로 선언된 정적 테스트가 아닌 동적으로 테스트를 사용한다.
@TestInstance
테스트 클래스의 생명주기를 설정한다.
@TestTemplate
공급자에 의해 여러 번 호출될 수 있도록 설계된 테스트 케이스 템플릿임을 나타낸다.
@TestMethodOrder
테스트 메소드 실행 순서를 구성하는데 사용한다.
@DisplayName
테스트 클래스 또는 메소드의 사용자 정의 이름을 선언할 때 사용한다.
@DisplayNameGeneration
이름 생성기를 선언한다.
@BeforeEach
모든 테스트 실행 전에 실행할 메소드를 선언할 때 사용한다.
@Before
@AfterEach
모든 테스트 실행 후에 실행한 메소드를 선언할 때 사용한다.
@After
@BeforeAll
현재 클래스를 실행하기 전 제일 먼저 실행할 테스트 작성하는데,  static로 선언한다.
@BeforeClass
@AfterAll
현재 클래스 종료 후 해당 테스트를 실행하는데,  static으로 선언한다.
@AfterClass
@Nested
클래스를 정적이 아닌 중첩 테스트 클래스임을 나타낸다.
@Tag
클래스 또는 메소드 레벨에서 태그를 선언할 때 사용한다.
@Disabled
이 클래스나 테스트를 사용하지 않음을 표시한다.
@Ignore
@Timeout
테스트 실행 시간을 선언 후 초과되면 실패하도록 설정한다.
@ExtendWith
확장을 선언적으로 등록할 때 사용한다.
@RegisterExtension
필드를 통해 프로그래밍 방식으로 확장을 등록할 때 사용한다.
@TempDir
필드 주입 또는 매개변수 주입을 통해 임시 디렉토리를 제공하는데 사용한다.

테스트 클래스와 메소드

테스트 클래스
테스트 클래스는 하나 이상의 테스트 메소드를 포함하는 최상위 클래스, static 클래스, 중첩 클래스여야 한다.
추상 클래스로 정의가 불가능하며 단일 생성자만 가질 수 있다.
테스트 메소드
@Test, @RepeatedTest, @ParameterizedTest, @TestFactory, @TestTemplate 중 하나의 어노테이션이 선언되어있는 메소드를 의미한다.
assertJ를 통해 테스트 코드의 가독성을 높이며 에러 메세지를 쉽게 확인할 수 있다.
생명주기 메소드
@BeforeAll, @BeforeEach, @AfterAll, @AfterEach 중 하나의 어노테이션으로 선언되어있는 메소드를 의미한다.
테스트, 생명 주기 메소드는 모두 추상 메소드로 정의가 불가하며 값을 반환해서도 안 된다. 그리고 두 메소드는 static이 아닌 인스턴스 메소드여야 한다.