junit5가 아직 릴리즈는 안되었지만 조만간 될듯 싶다. 그래서 중요 내용보다는 바뀐 부분을 살짝 알아보자.
일단 패키지명이 바뀌었다. 또한 메이븐의 GroupId와 ArtifactID도 바뀌었다. 문서를 보면 더 자세히 알 수 있다.
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.jupiter.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<version>${junit.vintage.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
junit5만 쓴다면 위에 jupiter만 쓰면 되는데 필자는 테스트를 위해 vintage까지 넣었다. vintage는 기존의 junit4가 포함되어 있다. 아직 상세하기 보진 않아서 그런것만 같다.
public class Junit4Test {
public Junit4Test(){
}
@BeforeClass
public static void beforeClass(){
System.out.println("beforeClass");
}
@Before
public void setup(){
System.out.println("setup");
}
@Test
public void test1(){
System.out.println("test1");
}
@Test
public void test2(){
System.out.println("test2");
}
@After
public void after(){
System.out.println("after");
}
@Ignore
@Test
public void ignore(){
System.out.println("ignore");
}
@AfterClass
public static void afterClass(){
System.out.println("afterClass");
}
}
위의 코드는 junit4의 코드이다. 다들 아시다시피 기본적인것만 넣었다. 잠깐 설명하자만 @BeforeClass는 static 메서드어야 하며 테스트를 실행시 최초 한번만 실행되는 어노테이션이다. 그리고 @Before는 테스트 실행시마다 실행되는 어노테이션이고 @Test는 말그대로 테스트를 실행하는 것이다. @Ignore는 테스트를 무시한다는 내용이고 @After는 테스트 종료시마다 실행된다. 마찬가지로 @AfterClass는 마지막에 한번 호출된다. 이 역시 static 이어야 한다. 참고로 모든 메서드가 public 이어야 하며 생성자 또한 public 이어야 한다.
그럼 다음으로 junit5를 보자.
class StandardTests {
StandardTests(){
}
@BeforeAll
static void beforeAll() {
System.out.println("BeforeAll");
}
@BeforeEach
void beforeEach() {
System.out.println("BeforeEach");
}
@Test
void test1() {
System.out.println("test1");
}
@Test
void test2() {
System.out.println("test2");
}
@Test
@Disabled("for demonstration purposes")
void disabled() {
System.out.println("Disabled");
}
@AfterEach
void afterEach() {
System.out.println("AfterEach");
}
@AfterAll
static void afterAll() {
System.out.println("AfterAll");
}
}
딱 보면 알듯 싶다. @BeforeAll는 @BeforeClass와 동일하고 @BeforeEach는 @Before와 동일하다. 나머지도 동일하고 @Ignore도 @Disabled로 바뀌었다. 근데 여기서 좀 많이 바뀐부분이 있다. class가 public이 아니어도 되고 메서드도 또한 public 메서드가 아니여도 상관없다. 또한 생성자도 public이 아니여도 된다. 생성자는 private이어도 가능하다. 하지만 기본 생성자는 있어야 한다.
@Test 어노테이션은 제외한 나머지는 private로 만들어도 잘 동작한다. 하지만 @Test를 private로 할경우에는 에러는 나지않지만 테스트를 진행하지 않는다.
그리고 원래 있었는지는 잘 모르겠지만 @DisplayName이라는 어노테이션이 있다. 뭐 딱히 테스트에 연관되지는 않았지만 테스트명을 바꿀수 있다. 문서에 나와있는 소스이다.
@DisplayName("A special test case")
class DisplayNameDemo {
@Test
@DisplayName("Custom test name containing spaces")
void testWithDisplayNameContainingSpaces() {
}
@Test
@DisplayName("╯°□°)╯")
void testWithDisplayNameContainingSpecialCharacters() {
}
@Test
@DisplayName("")
void testWithDisplayNameContainingEmoji() {
}
}
세번째는 이모티콘도 넣을 수 있는데 인텔리j에서는 이모티콘이 안들어간다. 필자가 모르는것 일 수 도 있다.
실행을 시키면 아래와 같이 나올 것이다.
이 외에도 좋은 점이 많아졌다고 생각되지만 아직 쓸일이 없기에 맛만 보자. 릴리즈 되면 그때다시 살펴보도록 하자!.
소스도 올려놓긴 하지만 딱히.. 별거 없다.
https://github.com/wonwoo/junit5-example.git