JUnit
자바의 소스를 테스트할때 가장 많이 사용하는 프레임 워크입니다.
Java + Test = JUnit
오랜 기간 Junit4를 사용해 왔지만 테스트 환경이 고도화 되고 많은 확장성을 요구하게 되면서 불편함이 발견되기 시작했습니다.
- 강한 결합도
- 부족한 확장성
- 많은 책임
IDE와 build툴에 강한 결합도, 하나의 @Runwith만 선언할 수 있는 제약, jar 하나에 부여되는 많은 책임이 부여되는 불편함이 생기기 시작했습니다.
불편함이 하나 둘 생기면서 개발자가 테스트코드를 작성할때 고려해야 할 사항들이 많아져 라이브러리 개선의 요구사항이 생기면서 JUnit5의 개발이 시작되었습니다.
- JUnit4 의 최근 릴리즈가 10년전
- 더이상 JUnit4 릴리즈 계획이 없음
이 사진은 JUnit5개발 시작을 위해 모인 Lambda 팀원들 입니다.
Gradle, InteliJ, .. 등 각 위치에서 활동중인 뛰어난 개발자들이 모여 개발에 필요한 돈 펀딩을 시작하면서 프로젝트가 시작되었습니다.
JUnit5
구조
JUnit5는
JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage
형태를 가지게 되는데 플렛폼 위에서 모듈이 실행되는 구조입니다.
위의 구조를 시작으로 JUnit5는
플랫폼이 Vintage, Jupiter, 3rd Party를 담당하고,
Launcher가 Build tools, IDE를 관리하는 방식으로 부담을 나누게 됩니다.
Junit5는 프로젝트 시작 당시 두가지 중점을 가지고 시작했습니다.
단순/확장성을 고려하기 위해 기존 구조를 통합하거나 제약이 있던 부분들을 분리한 부분이 상당 부분 있습니다.
변경사항
Java Version
JUnit4 = java 5이상
JUnit4 = java 8 이상
Annotations
JUnit 4 | JUnit 5 |
@Test | @Test |
@BeforeClass | @BeforeAll |
@AfterClass | @AfterAll |
@Before | @BeforeEach |
@After | @AfterEach |
@Ignore | @Disable |
@Category | @Tag |
@Nested | |
@TestFactory | |
@ExtendWith |
최대한 단순하게 사용하기 위해 기존에 public으로 선언해야 했던 Test 함수들이 public없이 사용 가능하게 바뀌었습니다.
//JUnit4
@Test
public void test() {
system.out.println("junit4");
}
//JUnit5
@Test
void test() {
system.out.println("junit5");
}
기존 Runner, MethodRule, TestRule로 나누어져있던 모듈을 Extension하나로 통합했으며
@ExtendWith, @RegisterExtension, Java의 ServiceLoader를 통해 등록할 수 있습니다.
추가된 기술
assertAll
assertAll로 선언된 여러개의 assert는 중간에 실패가 발생해도 모든 assert문을 실행하고 결과를 반환 합니다.
exction을 반환 받을 수 있으며 이를 통해 검증을 진행할 수 있습니다. 또한 assert에서 timeout을 설정할 수 있습니다.
@Test
void assertAllTEST() {
assertAll("String assert Case Test",
() -> assertEquals("test1" , name.toLowerCase()),
() -> assertEquals("test2" , name.toUpperCase())
);
}
@Test
void assertThrowsTEST() {
Exception except = assertThrows (
ArithmeticException.class, () -> calculator.divide(1,0)
);
assertEquals(" / by zero", excetion.getMessage());
}
DisplayName
기존의 사용법을 유지하며, 한글, 스페이스, 이모지, 특수문자를 선언할 수 있습니다.
Nested의 설정도 가능합니다.
@DisplayName("한글이 가능합니다.")
public class DisplayTest {
@DisplayName("★ 특수 문자도 가능★")
@Test
void t1() {
system.out.println("t1");
}
@Nested
@DisplayName("★ nested도 가능★")
class n1() {
system.out.println("n1");
@Nested
@DisplayName("★ nested2도 가능★")
class n1_n2() {
system.out.println("nn2");
}
}
}
reference
ifkakao(2020) : https://if.kakao.com/session/108
'IT 이야기 > Java' 카테고리의 다른 글
[Java Study] 6일차 상속(super, Dynamic Method Dispatch) (0) | 2020.12.25 |
---|---|
[Java Study] 5일차 클래스, 메소드 (class ,method) (0) | 2020.12.14 |
[Java Study] 4일차 선택문,조건문, junit5.. 그리고 트리 구조 (0) | 2020.12.05 |
[Java Study] 3일차 연산자 (0) | 2020.11.26 |
[Java Study] 2일차 타입(프리미티브 타입) 변수 (0) | 2020.11.21 |
댓글