카테고리 없음

junit5 맛만 보기

머룽 2023. 4. 21. 15:26
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에서는 이모티콘이 안들어간다. 필자가 모르는것 일 수 도 있다. 실행을 시키면 아래와 같이 나올 것이다. junit5 이 외에도 좋은 점이 많아졌다고 생각되지만 아직 쓸일이 없기에 맛만 보자. 릴리즈 되면 그때다시 살펴보도록 하자!. 소스도 올려놓긴 하지만 딱히.. 별거 없다. https://github.com/wonwoo/junit5-example.git