[JUnit5] JUnit5 기본 어노테이션
💬 학습에 들어가기에 앞서
요즘 취업 공고를 보면 많은 기업들이 단위 테스트, 통합 테스트 작성 경험을 자격 요건으로 공고를 내놓는 경우가 있습니다.
왜 이러한 경험을 요구할까요? 🤔
먼저, 테스트는 에러가 있다는 것은 보여줄 수 있지만,
에러가 없다는 것을 보여줄 수 없습니다.
저 역시 에러가 없는 애플리케이션은 존재하지 않는다고 생각합니다.
그러면 모든 에러를 처리할 수 없으니 그냥 방치하는게 좋을까요?
아니라고 생각합니다.
예상할 수 있는 에러는 처리하도록 설계하는 것이 좋다고 생각합니다.
그래서 기업들이 테스트 코드를 작성 경험을 요구하는 것 같습니다.😃
또한, 기업의 서비스의 규모가 커지면서 많은 개발자들이 필요하고,
많은 개발자들이 함께 지속 가능한 개발을 하기 위해서는 협업 해야 합니다.
이때 개발자들이 서로 신뢰할 수 있는 간단 명료한 방법 중 하나가 00님이 작성한 기능이 테스트 코드를 통과 했을까?라고 생각합니다.
테스트를 읽는 것이 코드를 이해하기 쉽게 한다. 라는 말을 들어보셨나요?
만약 A팀에 새로운 개발자 분이 오셨습니다.
만약 테스트 코드가 있다면 새로온 개발자는 금방 서비스에 적응할 수 있을 것 입니다.
결국, 신입 개발자, 기존 개발자들 간에 서로 신뢰하며 서비스를 안정적으로 운영하기 위해서는
테스트 코드를 작성하는 것이 중요하다고 할 수 있습니다…!
그래서 저도 서로 신뢰할 수 있는 개발자가 되기 위해서JUnit
을 학습하고 이에 대한 내용을 정리하려고 합니다.^^
JUnit5님은 누구인가요? 🤷🏻♂️
JUnit5
는 TestEngine API
구현체라고 할 수 있습니다.
즉, 자바 개발자가 가장 많이 사용하는 테스팅 프레임 워크 입니다.
JUnit Platform
은 JVM
에서 테스트 프레임 워크를 사용하기 위한 인터페이스(TestEngine API
) 입니다.JUnit Jupiter
는 TestEngine API
를 구현한 구현체 입니다.JUnit Vintage
는 JUnit 4, 3
을 지원하는 TestEngin API
를 구현한 구현체 입니다.
- JUnit
- JUnit Platform
- 테스트를 실행해주는 런처 제공함
TestEngine API
를 제공함
- JUnit Jupiter
TestEngine API
구현체(JUnit5
)
- JUnit Vintage
JUnit 4, 3
을 지원하는TestEngine API
구현체
- JUnit Platform
참고
JUnit 기본 어노테이션
JUnit
에서 사용하는 기본 어노테이션은 다음과 같습니다.
실행 어노테이션
- @Test
- 단위 테스트 실행
- @BeforeAll
- 클래스 내에 모든 단위 테스트 실행 전 1회만 호출
- @AfterAll
- 클래스 내에 모든 단위 테스트 실행 후 1회만 호출
- @BeforEach
- 각각의 단위 테스트 실행 전 1회씩 호출
- @AfterEach
- 각각의 단위 테스트 실행 후 1회씩 호출
- @Disable
- 단위 테스트 실행하지 않음
import org.junit.jupiter.api.*;
import static org.junit.jupiter.api.Assertions.*;
class StudyTest {
@Test
void create() {
Study study = new Study();
System.out.println("테스트 실행");
}
@BeforeAll
static void beforeAll() {
System.out.println("BeforeAll는 클래스 내에 모든 테스트 실행전 1회만 호출 된다. 반드시 반환 타입을 static void로 작성해야 한다.");
}
@AfterAll
static void afterAll() {
System.out.println("AfterAll은 클래스 내에 모든 테스트 실행 후 1회만 호출된다. 반드시 반환 타입을 static void로 작성");
}
@BeforeEach
void beforeEach() {
System.out.println("BeforeEach는 각각의 테스트 실행 전에 1회씩 호출된다.");
}
@AfterEach
void afterEach() {
System.out.println("AfterEach는 각각의 테스트 실행 후 1회씩 호출된다.");
}
@Disabled
void disabled() {
System.out.println("Disabled는 테스트를 실행하지 않는다.");
}
}
결과
테스트 이름을 설정하는 방법
위 결과를 보시면 create()
라는 테스트를 실행 했다고 나옵니다.create()
말고 우리가 테스트 이름을 만들 수 는 없을까요? 🤔
왜냐하면 메소드 이름만으로는 테스트 케이스를 표현하기 어렵습니다..
복잡한 로직이면 메소드 이름이 길어지겠죠?
만들 수 있습니다^^!
- @DisplayNameGeneration
Method
와Class
레퍼런스를 사용해서 사용자가 정의한 테스트 이름을 표기- 기본 구현체는
ReplaceUnderscores
DisplayNameGenerator
의 구현체를 사용하면 됩니다.@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
- @DisplayName
Method
에 테스트 이름을 직접 정의하는 방법@DisplayName(“새로운 테스트”)
와 같이 사용하면 됩니다.
@DisplayNameGeneration
보다 우선 순위가 높음
@DisplayNameGeneration
import org.junit.jupiter.api.*;
import static org.junit.jupiter.api.Assertions.*;
// Method와 Class 레퍼런스를 사용해서 테스트 이름을 표기하는 방법을 설정
@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
class StudyTest {
@Test
void my_new_test() {
System.out.println("새로운 테스트 입니다.");
}
}
결과my_new_test()
에서 _
를 공백으로 치환하여 my new test
라는 이름의 테스트가 실행되었습니다.
@DisplayName
import org.junit.jupiter.api.*;
import static org.junit.jupiter.api.Assertions.*;
// Method와 Class 레퍼런스를 사용해서 테스트 이름을 표기하는 방법을 설정
@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
class StudyTest {
@Test
@DisplayName("새로운 테스트")
void my_new_test() {
System.out.println("새로운 테스트 입니다.");
}
}
결과@DisplayName("새로운 테스트”)
에서 설정한 새로운 테스트
라는 이름으로 테스트가 실행되었습니다.
또한, @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
보다 우선순위가 높다는 것도 확인할 수 있습니다.^^
참고
'테스트 > 0+ JUnit' 카테고리의 다른 글
[JUnit] 회원가입 API 컨트롤러, 서비스, 리포지토리 테스트 예제 (5) | 2023.06.09 |
---|---|
[JUnit5] 인스턴스 테스트와 테스트 순서대로 실행하는 방법 (0) | 2023.05.17 |
[JUnit5] 테스트 인자 값 타입 변환하는 방법 (0) | 2023.05.17 |
[JUnit5] 환경변수 조건에 따라 테스트 실행하는 방법 (0) | 2023.05.05 |
[JUnit5] Assertions 기본 사용법 (0) | 2023.05.05 |