이 글은 백기선 님의 더 자바, 애플리케이션을 테스트하는 다양한 방법 강의를 듣고 복습 차원에서 적은 글입니다.
TDD(TEST-Driven Development) 테스트 주도 개발을 하는 곳이 많이 늘어나면서 테스트에 대한 확실한 공부가 필요하다고 생각했다. 자바 개발자가 가장 많이 사용하는 테스팅 프레임워크 JUnit에 대해서 공부하겠다. JUnit은 자바 8 이상 가능한 JUnit5를 중심으로 공부하겠다.
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
JUnit5 = JUnit Platform + Jupiter + Vintage
- Platform : 테스트를 실행해주는 런처 제공, TestEngine API 제공.
- Jupiter : TestEngine API 구현체로 JUnit5를 제공.
- Vintage : JUnit4와 3을 지원하는 TestEngin 구현체.
JUnit5 외에는 사용하지 않겠다면 다음과 같이 exclude를 하면 된다.
테스트의 Class와 Method
- Class : Test method를 포함하는 클래스
- Test Method : @Test, @RepeatedTest, @ParameterizedTest, @TestFactory, @TestTemplate이 선언되어 있는 메서드
- Lifecycle Method : @BeforaAll, @AfterAll, @BeforeEach, @AfterEach가 선언되어있는 메서드로 Test의 라이프사이클에 따라 실행되는 메서드 (※실행 순서 : BeforeAll → BeforeEach → Test → AfterEach → AfterAll)
@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
class StudyTest {
// 자바 리플렉션 사용 public 필요 없다.
@Test
@DisplayName("스터디 만들기")
void create() {
Study study = new Study();
assertAll(
() -> assertNotNull(study),
() -> assertEquals(study.getStudyStatus(), StudyStatus.DRAFT, () -> "스터디를 처음 만들면 상태값이 DRAFT 이다."),
() -> assertTrue(1 < 2)
);
// assertTimeoutPreemptively -> 시간이 지나면 종료
assertTimeout(Duration.ofMillis(100), () -> {
new Study();
Thread.sleep(300);
});
}
@Test
@DisplayName("스터디 만들기 1")
void create1() {
System.out.println("create1");
}
@BeforeAll
@Disabled // 해당 메소드는 Skip 한다.
static void beforeAll() {
System.out.println("before All");
}
@AfterAll
static void afterAll() {
System.out.println("after All");
}
@BeforeEach
void beforeEach() {
System.out.println("Before Each");
}
@AfterEach
void afterEach() {
System.out.println("after Each");
}
}
JUnit5 : Assertion
- JUnit5에서 가장 많이 사용하는 구문이다.
- AssertJ, Hemcrest, Truth 등의 라이브러리를 사용할 수도 있다.
assertEquals(expected, actual) | 실제 값이 기대한 값과 같은지 확인 |
assertNotNull(actual) | 값이 null이 아닌지 확인 |
assertTrue(boolean) | 다음 조건이 참(true)인지 확인 |
assertAll(executables...) | 모든 확인 구문 확인 |
assertThrows(expectedType, executable) | 예외 발생 확인 |
assertTimeout(duration, executable) | 특정 시간 안에 실행이 완료되는지 확인 |
JUnit5 : Assumption, @Enabled___&@Disabled___
- 특정한 조건을 만족하는 경우 테스트를 실행하는 방법이다.
- Assumption 메소드는 조건이 만족할 때 그 밑에 있는 코드들이 실행한다.
@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
class StudyTest {
// 자바 리플렉션 사용 public 필요 없다.
@Test
@DisplayName("스터디 만들기")
@EnabledOnJre({JRE.JAVA_8, JRE.JAVA_9}) // Java Version 조건
@EnabledIfEnvironmentVariable(named = "TEST_EVN", matches = "LOCAL") // 환경변수 값 조건
void create() {
Study study = new Study();
assumeTrue(study.getStudyStatus().equals("STARTED")); // 조건
assumingThat(study.getStudyStatus().equals("STARTED"), () -> System.out.println("성공")); // 조건, 테스트
}
@Test
@DisplayName("스터디 만들기 1")
@DisabledOnOs(OS.WINDOWS) // OS 조건
void create1() {
System.out.println("create1");
}
}
'BackEnd > Java' 카테고리의 다른 글
[Java] 더 자바, Java 8 이야기 1부 - 함수형 인터페이스 & 람다 (0) | 2020.09.20 |
---|---|
[Java] 컬렉션 프레임워크(collection framework) 이야기 2부 - Set (0) | 2020.09.18 |
[Java] 컬렉션 프레임워크(collection framework) 이야기 1부 - List (0) | 2020.09.17 |
[Java] 가비지 컬렉션(GC, Garbage Collection) 이란? (0) | 2020.09.10 |
[Java] 자바 가상 머신(JVM, Java Virtual Machine) 이란? (0) | 2020.09.08 |
댓글