테스트 코드 작성 목적
- 코드의 안정성을 높일 수 있음
- 기능을 추가하는 과정에서 발생하는 side-effect를 최소화
- 해당 코드가 작성된 목적을 명확하게 이해 가능
JUnit이란?
-
java의 대표적인 Test Framework
-
단위 테스트를 위한 도구를 제공
단위테스트? 모든 함수와 메소드에 대한 각각의 테스트 케이스를 작성하는 것
-
어노테이션 가반으로 테스트를 지원
-
Spring Boot2.2부터는 JUnit5를 지원
-
JUnit5 = Jupiter, Platform, Vintage 모듈로 구성
1. Jupiter
- TestEngine API의 구현체로 JUnit5를 구현하고 있다.
- 테스트의 실제 구현체는 별도 모듈 역할을 수행 하는데 그 모듈 중 하나가 Jupiter-Engine이다.
- Jupiter-Engine는 Jupiter API를 사용하여 작성한 테스트 코드를 발견하고 실행하는 역할을 수행, 개발자가 테스트 코드를 작성할 때 사용된다.
- Test를 실행하기 위한 뼈대
- TestEngine 인터페이스를 가지고 있음
- TestEngine을 통해 Test를 발견하고, 수행결과를 보고함
(Platform = TestEngine API+ Console Launcher + JUnit 4 Based Runner)
3. Vintage
- TestEngine API의 구현체로 JUnit 3, 4를 구현하고 있다.
- 기존 JUnit 3, 4 버전으로 작성된 테스트코드를 실행할 때 사용. Vintage-Engine을 포함하고 있다.
JUnit LifeCycle Annotation
- JUnit 5의 테스트 라이프 사이클 어노테이션
JUnit Main Annotation
- @Import
- 필요한 Class들을 Configuration으로 만들어 사용 가능
- Configuration Component 클래스도 의존성 설정할 수 있음
- import된 클래스는 주입으로 사용 가능
통합테스트
- 여러기능을 조합하여 전체 비지니스 로직을 확인
- 모든 빈을 스캔하고 로드하는 작업이 반복되어 매번 무거운 작업을 수행해야 함
단위 테스트
- 프로젝트에 필요한 모든 기능에 대해 각각 테스트를 진행
First 원칙
- Fast: 테스트 코드의 실행은 빠르게 진행되어야 함.
- Independent: 독립적인 테스트가 가능해야 한다.
- Repeatable: 매번 같은 결과를 만들어야 한다.
- Self-Validating: 테스트는 그자체로 실행, 결과 확인 가능
- Timely: 단위 테스트는 비지니스 코드가 완성되기 전에 구성하고 테스트가 가능해야 함(TDD의 경우)
참고
https://www.youtube.com/watch?v=SFVWo0Z5Ppo&ab_channel=%EC%96%B4%EB%9D%BC%EC%9A%B4%EB%93%9C%ED%97%88%EB%B8%8C%EC%8A%A4%ED%8A%9C%EB%94%94%EC%98%A4-AroundHubStudio