https://sundaland.tistory.com/71
자바 프로그래밍 언어를 위한 단위 테스트 프레임워크이다. 개발자가 S/W의 작은 부분을 독립적으로 테스트할 수 있게 해주는 도구로, S/W 개발 과정에서 중요한 역할을 한다.
JUnit은 테스트 주도 개발(TDD)면에서 중요하며 SUnit과 함께 시작된 XUnit이라는 이름의 유닛 테스트 프레임워크 개열이다. JUnit는 컴파일 타임에 JAR로서 링크된다. JUnit 프레임워크는 JUnit 3.8 이하의 경우 junit.framework 패키지 밑에 상주하며, JUnit 4 이상의 경우 org.junit 패키지 밑에 상주한다.
JUnit는 단위 테스트를 지원한다. 단위 테스트란 S/W의 가장 작은 단위 (주로 메소드)가 의도대로 작동하는지 검증하는 테스트이다.
JUnit의 주요 구성 요소
- Test Case : 테스트할 메서드를 포함하는 클래스이다. @Test 어노테이션을 사용하여 테스트 메서드를 정의한다.
- Test Suite : 여러 테스트 케이스를 그룹화하여 한 번에 실행할 수 있다.
- Assertion : 실제 값과 예상 값을 비교하여 테스트가 통과했는지 확인한다. assertEquals, assertTure 등의 메서드를 제공한다.
테스트 생명주기
- @BeforeClass : 모든 테스트가 실행되기 전에 한 번만 실행된다.
- @Before : 각 테스트 메서드가 실행되기 전에 실행된다.
- @After : 각 테스트 메서드가 실행된 후에 실행된다.
- @AfterClass : 모든 테스트가 실행된 후에 한 번만 실행된다.
테스트 실행
- JUnit 테스트는 IDE나 빌드 도구(Maven, Gradle 등)을 통해 실행할 수 있다.
- 테스트 결과는 성공, 실패, 에러 등으로 분류되어 보고된다.
JUnit는 테스트 주도 개발(TDD), 즉 코드를 작성하기 전에 테스트를 먼저 작성하는 방법론과 잘 어울린다.
JUnit 5의 새로운 기능
- 람다식을 지원하여 간결한 테스크 코드 작성이 가능하다.
- @DisplayName 어노테이션을 통해 테스트 이름을 지정할 수 있다.
- 조건에 따른 테스트 실행 (@EnabledOnOs, @DisabledOnOs 등)을 지원한다.
JUnit는 자바 개발자에게 필수적인 도구로, S/W 품질을 향상시키고 버그를 조기에 발견하는데 큰 도움이 된다.
JUnit 플랫폼
JUnit 5의 기반이 기반이 되는 부분으로, 테스트 프레임워크가 실행되는 플랫폼을 제공한다.
- 테스트 엔진 API : 여러 테스트 엔진들이 JUnit 플랫폼 위에서 동작할 수 있도록 지원한다. JUnit 주피터와 JUnit 빈티지는 이 API를 구현한다.
- Launcher API : 프로그래밍 방식으로 테스트를 시작하고 겨로가를 가져올 수 있게 해주는 API이다.
- TestEngine : 사용자 정의 테스트 엔진을 개발할 수 있는 API를 제공한다.
- Console Launcher: 커맨드 라인을 통해 JUnit 테스트를 실행할 수 있게 해주는 도구이다.
- JUnit Platform Suite API : 여러 테스트 클래스를 하나의 테스트 스위트로 그룹화하는 기능을 제공한다.
JUnit 주피터 (Juptier)
JUnit 5에서 테스트 작성 및 실행을 위한 주요 API와 확장 모델을 제공한다.
- 새로운 어노테이션 : @Test, @ParameterizedTest, @TestFactory, @TestTemplete, @BeforeEach, @AfterEach, @BeforeAll, @AfterAll 등이 있으며, JUnit 4와는 다른 새로운 어노테이션들을 제공한다.
- 확장 모델 : 사용자 정의 확장을 만들 수 있게 해주는 강력한 확장 모델을 제공한다. @ExtendWith 어노테이션을 사용하여 확장을 적용할 수 있다.
- Parameterized Tests : 다양한 매개변수로 같은 테스트를 여러 번 실행할 수 있게 해주는 기능이다.
- Dynamic Tests : 프로그래밍 방식으로 테스트를 동적으로 생성하고 실행할 수 있게 해주는 기능이다.
- Assertions and Assumptions : 테스트 검증을 위한 다양한 어설션과 가정을 제공한다.
JUnit 빈티지 (Vintage)
JUnit 3와 JUnit 4로 작성된 테스트를 JUnit 5 플랫폼에서 실행할 수 있게 해주는 테스트 엔진이다. 이를 통해 이전 버전의 JUnit을 사용하는 프로젝트도 JUnit 5의 기능과 이점을 활용할 수 있다.
테스트 픽스처 (Fixture)
S/W 테스트에서 사용되는 용어로, 테스트 실행 전에 테스트 환경을 설정하기 위해 필요한 모든 것들을 의미한다. 테스트 픽시처는 테스트가 실행될 때 필요한 일관된 상태를 보장하는 데 중요한 역할을 한다. 이것은 테스트에 필요한 데이터, 객체, 설정, 파일 등 다양한 요소들을 포함할 수 있다.
- 일관성 : 모든 테스트는 동일한 조건하에서 시작되어야 한다. 픽스처는 모든 테스트에 동일한 환경을 제공한다.
- 재사용성 : 같은 픽스처를 여러 테스트에서 재사용함으로써 코드의 중복을 줄일 수 있다.
- 코드 정리 : 테스트 코드에서 환경 설정 코드를 분리함으로써 테스트 코드의 가독성과 관리 용이성을 높인다.
사용 예시로 데이터베이스 연결 설정, 테스트에 사용될 임시 파일 생성, 테스트에 필요한 객체의 인스턴스화, 특정 상태를 가진 Mock 객체의 생성, 설정 파일 또는 환경 변수의 초기화
- @Before/@BeforeEach : 각 테스트가 실행되기 전에 픽스처를 설정한다.
- @BeforeClass/@BeforeAll : 모든 테스트가 실행되기 전에 한 번만 실행되는 픽스처를 정리한다.
- @After/@AfterEach : 각 테스트가 실행된 후에 픽스처를 정리한다.
- @AfterClass/@AfterAll : 모든 테스트가 실행된 후에 한 번만 실행되는 픽스처를 정리한다.
테스트 픽스처는 테스트의 신뢰성과 재현성을 높이는 데 중요한 역할을 하며, 테스트 코드를 더 깔끔하고 관리하기 쉽게 만들어 준다.
JUnit 5에서는 테스트 메서드에 public 액세스 제한자를 선언할 필요가 없습니다. 이는 JUnit 5의 중요한 변경 사항 중 하나로, JUnit 5는 리플랙션을 사용하여 테스트 메서드를 찾고 실행하기 때문에 public 액세스 제한자가 필요하지 않다.
- 코드의 간결성 : 테스트 메서드에 public를 명시할 필요가 없어져 코드를 더 간결하고 읽기 쉬워진다.
- 캡슐화 유지 : 테스크 클래스 내부에서만 사용되는 메서드들은 외부에 노출할 필요가 없어, 더 강한 캡슐화를 유지할 수 있습니다.
- 일관성 : JUnit 5는 자바 8 이상의 기능을 활발히 사용하여, 자바 8 이상에서는 메서드 레퍼런스나 람다 등을 사용할 때 메서드가 굳이 public일 필요가 없다.
# 스프링 IoC 컨테이너를 사용하기 위해 JUnit 프레임워크에 연결하여 사용한다.
Spring TestContext Framework
Spring 프레임워크의 일부로, Spring 기반 애플리케이션의 통합 테스트를 지원하는 강력한 테스팅 프레임워크이다. 이 프레임워크는 Spring 애플리케이션 컨텍스트를 테스트에 쉽게 통합할 수 있도록 설계되었고, Spring 의존성 주입, 트랜잭션 관리, Spring MVC 테스트 등의 기능을 제공한다.
- Spring 애플리케이션 컨텍스트 관리 : Spring TestContext 프레임워크는 테스트 실행 동안 Spring ApplicationContext를 캐시하고 관리한다. 이를 통해 여러 테스트에서 동일한 컨텍스트를 재사용할 수 있어 테스트 실행 시간을 단축시킨다.
- 의존성 주입 : 테스트 인스턴스에 필요한 의존성을 Spring 컨테이너에서 주입받을 수 있다. 지금은 사용하지 않지만 @Autowired와 같은 어노테이션을 사용하여 테스트 내의 필드나 메서드에 의존성을 주입한다.
- 어노테이션 기반 설정 : @ContextConfiguration, @WebAppConfiguration, @Transactional 등 다양한 어노테이션을 제공하여 테스트 컨텍스트 설정을 용의하게 한다.
- 트랜잭션 관리 : @Transactional 어노테이션을 사용하여 테스트 메서드를 트랜잭션 내에서 실행하고, 테스트 후에 트랜잭션을 롤백할 수 있다. 이를 통해 DB 상태 변경 없이 데이터 관련 테스트를 수행할 수 있다.
- Spring MVC 테스트 지원 : MockMVC를 사용하여 Spring MVC 컨트롤러의 HTTP 요청 및 응답을 테스트할 수 있다. 이를 통해 실제 서브릿 컨테이너 없이도 Spring MVC 애플리케이션을 테스트할 수 있다.
Spring TestContext 프레임워크는 Spring 기반 애플리케이션을 위한 강력한 테스팅 도구이다. 이 프레임워크는 Spring 특징들을 완벽하게 활용하여, 테스트 코드의 작성과 실행을 보다 쉽고 효율적으로 만들어 준다.
통합 테스트뿐만 아니라 단위 테스트에도 유용하게 사용할 수 있으며, Spring 애플리케이션 개발에 있어 중요한 역할을 한다.
SpringExtension.class
JUnit 5에서 제공하는 Spring TestContext Framwork의 확장으로, Spring ApplicationContext와의 통합을 지원한다. 이 확장을 사용함으로써 JUnit 5 테스트에서 Spring의 기능을 완전히 활용할 수 있다. 주요 목적은 테스트 중에 Spring의 의존성 주입, 트랜잭션 관리, 스프링 설정 및 빈 생성 및 관리 등을 사용할 수 있게 하는 것이다.
- 의존성 주입 지원 : Spring의 의존성 주입 기능을 테스트 클래스에 적용할 수 있다.
- Spring 애플리케이션 컨텍스트 관리 : 테스트 실행 동안 Spring 애플리케이션 컨텍스트를 생성하고 관리한다. @Autowired와 같은 어노테이션을 사용하여 테스트 내의 필드나 메서드에 의존성을 주입한다.
- 트랜잭션 관리 : 테스트 메서드에서 @Transactional 어노테이션을 사용하면 해당 테스트가 트랜잭션 내에서 실행된다. 대부분의 경우 테스트 종류 후 트랜잭션이 자동으로 롤백되어, 테스트가 DB 상태에 영향을 주지 않는다.
- Spring 설정 로드 : @ContextConfiguration 어노테이션을 사용하여 테스트에 필요한 Spring 설정을 지정할 수 있다. 이를 통해 테스트에 필요한 빈, 설정 클래스 또는 XML 설정 파일을 로드할 수 있다.
작성중
@ExtendWith
작성중
'테스트 주도 개발 (TDD)' 카테고리의 다른 글
Mockito (0) | 2024.08.28 |
---|---|
테스트 주도 개발 (TDD) (0) | 2024.08.08 |
단위 테스트 (Unit Test) (0) | 2024.08.07 |