2026년 상식닷컴 선정 식당 & 카페 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요

JUnit 4와 JUnit 5의 차이점은 무엇인가요?

_____
Q1: JUnit 4와 JUnit 5의 가장 큰 차이점은 무엇인가요?
A1: JUnit 5는 JUnit 4에 비해 모듈화되고 확장성이 강화된 새로운 아키텍처를 가지고 있습니다. JUnit 4는 단일 JAR로 구성된 반면, JUnit 5는 플랫폼, Jupiter(테스트 엔진), Vintage(이전 버전 호환) 모듈로 나뉘어 있어 유연하고 다양한 테스트 프레임워크와 통합이 용이합니다.

Q2: JUnit 5는 어떤 자바 버전을 지원하나요?
A2: JUnit 4는 자바 5 이상을 지원하는 반면, JUnit 5부터는 최소 자바 8 이상이 필요합니다. 이는 람다 표현식과 스트림 API 같은 최신 자바 기능을 활용하기 위해서입니다.

Q3: JUnit 5에서 바뀐 테스트 어노테이션에는 어떤 것들이 있나요?
A3: JUnit 4의 @Test, @Before, @After, @BeforeClass, @AfterClass 등이 JUnit 5에서는 각각 @Test, @BeforeEach, @AfterEach, @BeforeAll, @AfterAll로 이름이 변경되고 기능도 일부 개선되었습니다. 특히 @BeforeAll과 @AfterAll은 기본적으로 static이어야 했던 제약이 해제되었고, 더 유연해졌습니다.

Q4: JUnit 5에서 제공하는 새로운 기능은 무엇인가요?
A4: JUnit 5는 반복 테스트(@RepeatedTest), 조건부 테스트 실행(@EnabledOnOs, @DisabledIf), 태그 기반 필터링(@Tag), 동적 테스트(@TestFactory) 등 새로운 기능을 도입해 테스트 작성과 실행을 더 세밀하게 제어할 수 있습니다.

Q5: JUnit 4 테스트를 JUnit 5에서 바로 실행할 수 있나요?
A5: 네, JUnit 5는 Vintage 모듈을 통해 기존 JUnit 4 테스트를 실행할 수 있도록 호환성을 제공합니다. 이를 통해 점진적으로 JUnit 5 기능을 도입할 수 있습니다.

Q6: 테스트 확장성이 어떻게 개선되었나요?
A6: JUnit 4는 Rules, Runners 방식으로 확장했지만, JUnit 5는 확장 API(Extension Model)를 제공하며, 이로 인해 테스트 라이프사이클 훅, 조건부 실행, 파라미터 인젝션 등이 더 깔끔하고 강력하게 구현됩니다.

Q7: assertion과 assumption 관련 차이는 무엇인가요?
A7: JUnit 5에서는 Assertions와 Assumptions 클래스로 assertion과 assumption API를 분리했고, 메시지 제공 방식도 람다식으로 지연 처리해 성능이 개선되었습니다. 또한 더 다양한 assertion 메서드가 추가되었습니다.

Q8: 테스트 실행 방법에 차이가 있나요?
A8: JUnit 4는 JUnitCore나 IDE 내장 실행기를 사용하지만, JUnit 5는 자체 플랫폼에서 여러 테스트 엔진(Jupiter, Vintage)을 선택하여 실행할 수 있어 멀티 플랫폼 통합이 더 유연합니다.

Q9: 테스트 라이프사이클은 어떻게 바뀌었나요?
A9: JUnit 4의 @Before/@After는 각 테스트마다 실행되었고, @BeforeClass/@AfterClass는 클래스당 한 번 실행됐지만, JUnit 5에서는 @BeforeEach, @AfterEach, @BeforeAll, @AfterAll로 명확히 구분되고, 인스턴스 메서드에서 @BeforeAll 등을 사용할 수 있어 유연해졌습니다.

Q10: JUnit 5 도입 시 고려해야 할 점은 무엇인가요?
A10: 최소 자바 8 이상 필요, 기존 JUnit 4 API와 일부 다름, 빌드 도구(Gradle/Maven) 설정 변경, IDE 플러그인 호환성 확인, Legacy 테스트는 Vintage 모듈 필요 등을 고려해야 합니다.
JUnit 4와 JUnit 5는 자바에서 가장 널리 사용되는 단위 테스트 프레임워크입니다.

둘 다 테스트 작성과 실행을 돕지만, 설계, 아키텍처, 기능 면에서 여러 가지 중요한 차이점이 존재합니다.

아래에 그 차이점들을 자세히 설명합니다.

1. 아키텍처 및 모듈화 - *JUnit 4*: 단일 JAR 파일(junit-4.x.jar)로 제공되며, 모놀리식(monolithic) 구조를 띕니다.

테스트 프레임워크와 러너, 어노테이션 등이 하나의 패키지 내에 통합되어 있습니다.

- *JUnit 5*: 완전히 새롭게 설계된 모듈화 구조를 갖고 있습니다.

JUnit Platform, JUnit Jupiter, JUnit Vintage 세 가지 주요 컴포넌트로 나뉩니다.

- JUnit Platform : 테스트 실행 환경과 런처 역할을 수행하며, 다양한 테스트 엔진(JUnit 4, JUnit Jupiter 등)을 지원할 수 있음. - JUnit Jupiter : JUnit 5에서 도입된 새로운 프로그래밍 및 확장 모델을 포함하는 API. - JUnit Vintage : 기존 JUnit 3와 4 테스트를 실행할 수 있도록 돕는 호환성 엔진. 이런 분리 덕분에 유연성과 확장성이 크게 향상되었습니다.



2. 어노테이션과 테스트 라이프사이클 - *JUnit 4*: `@Test`, `@Before`, `@After`, `@BeforeClass`, `@AfterClass` 등 제한된 어노테이션 세트를 사용합니다.

테스트 메서드는 반드시 `public void` 여야 합니다.

- *JUnit 5*: JUnit Jupiter가 새로운 어노테이션 세트를 제공합니다.

- 테스트 메서드는 `public`일 필요 없이 아무 접근 제어자도 사용할 수 있습니다.

- 라이프사이클 관련 어노테이션이 `@BeforeEach`, `@AfterEach`, `@BeforeAll`, `@AfterAll`로 바뀌었으며, 훨씬 직관적입니다.

- 테스트 인스턴스 생명주기 변경이 가능합니다.

기본적으로 각 테스트마다 새로운 인스턴스가 생성되는 대신, `@TestInstance(Lifecycle.PER_CLASS)`를 사용해 클래스 단위 인스턴스를 쓸 수도 있습니다.



3. 확장 모델과 커스터마이징 - *JUnit 4*: 확장은 주로 `@RunWith`와 커스텀 러너(Runner) 생성을 통해 이루어집니다.

하지만 러너는 클래스 단위로만 적용할 수 있어 제한적입니다.

- *JUnit 5*: `Extension` API로 작성되는 확장 모델을 도입해 훨씬 강력하고 세밀한 확장이 가능합니다.

각 테스트 메서드, 파라미터, 실행 전후 등 다양한 지점에서 확장이 가능하며, 여러 확장을 병렬로 적용할 수 있습니다.



4. 조건적 테스트 실행 - *JUnit 4*: 조건부 테스트 실행에 대한 기본 지원이 미비합니다.

필요하다면 외부 라이브러리를 사용하거나 커스텀 러너를 작성해야 했습니다.

- *JUnit 5*: `@EnabledOnOs`, `@DisabledOnOs`, `@EnabledIf`, `@DisabledIf`, `@EnabledOnJre` 같은 다양한 조건부 어노테이션이 기본 제공되어 운영체제, JRE 버전, 시스템 속성 등 조건에 따라 테스트를 쉽게 제어할 수 있습니다.



5. 파라미터화 테스트 지원 - *JUnit 4*: `@RunWith(Parameterized.class)`를 이용한 파라미터화 테스트가 가능하지만, 사용법이 다소 번거롭고 제한적입니다.

- *JUnit 5*: `@ParameterizedTest` 어노테이션과 다양한 소스(`@ValueSource`, `@CsvSource`, `@MethodSource` 등)를 제공해 훨씬 편리하고 강력한 파라미터화 테스트가 지원됩니다.



6. 동시성 및 병렬 테스트 실행 - *JUnit 4*: 병렬 테스트 실행을 지원하지 않으며, 외부 툴이나 커스텀 러너, 빌드 툴 설정을 통해서만 가능했습니다.

- *JUnit 5*: 기본적으로 병렬 실행 기능을 내장하고 있으며, 설정을 통해 테스트 클래스 또는 메서드 단위로 병렬 실행을 쉽게 설정할 수 있습니다.



7. Assertions 및 Assumptions 개선 - *JUnit 4*: 기본적인 assertion과 assumption 메서드를 제공하지만 제한적입니다.

- *JUnit 5*: 다양한 새 assertion 메서드가 추가되고, 람다를 사용해 실패 메시지를 늦게 평가하는 등 사용성을 크게 개선했습니다.



8. 레거시 지원 - *JUnit 4*: JUnit 3와 비교적 호환성을 제공하지만, 별도로 JUnit 5를 사용할 수 없었습니다.

- *JUnit 5*: JUnit Vintage를 통해 기존 JUnit 3과 4 테스트를 그대로 실행할 수 있도록 지원합니다.

따라서 기존 테스트를 유지하면서 점진적으로 JUnit 5로 전환 가능.



9. 빌드 도구 및 IDE 통합 - JUnit 5는 JUnit 4보다 최신 빌드 도구(Gradle, Maven) 및 주요 IDE에서 더 적극적으로 지원되며, JUnit Platform을 통해 다양한 테스트 프레임워크를 함께 실행할 수 있는 인터페이스를 제공합니다.

--- JUnit 5는 JUnit 4에 비해 훨씬 모듈화되고 확장 가능하며 현대적인 자바 기능(람다, 스트림 등)을 활용할 수 있게 제작되었습니다.

그 결과 더 유연하고 표현력이 뛰어난 테스트 코드 작성이 가능하며, 병렬 실행과 조건부 테스트 등 다양한 최신 테스트 요구사항을 기본 지원합니다.

반면, JUnit 4는 단순하고 익숙한 구조를 갖고 있지만 확장성이나 최신 기능 지원이 부족한 편입니다.

따라서 새로운 프로젝트에서는 JUnit 5를 권장하며, 기존 프로젝트는 JUnit Vintage를 통해 호환하며 점진적 마이그레이션하는 방식이 일반적입니다.

작성자: 정재민 [비회원] | 작성일자: 1년 전 2025-05-26 02:50:48
조회수: 206 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.