스프링 부트 공부를 할 때 Test의 중요성에 대해서 자주 들었지만, Test에 대해 자신이 없고, 배우기가 막막해 적용을 하지는 못했었다. 인프런에 백기선 강사님의 테스트에 대한 강의가 있어서, 이 기회에 배워서 적용해야겠다고 생각했다.
Songstagram 프로젝트 피드백으로 테스트가 부족하다는 지적을 많이 받았다.
나도 좋은 테스트를 작성해서 프로젝트를 발전시켜야 겠다고 생각해서 Test를 공부하려고 한다.
1. JUnit 5
자바 개발자의 93% 이상이 테스트 작성시 JUnit을 사용한다고 한다.
거의 이것만 알아도 테스트 작성에 무리가 없다는 뜻이다.
자바 8이상을 필요로 한다고 한다.
JUnit 가이드 : https://junit.org/junit5/docs/current/user-guide/
영어로 되어 있으나 해석에 큰 무리는 없다.
JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage
JUnit 5 소개글에 있던 글이다. 플랫폼, 주피터, 빈티지를 합친 것이 JUnit 5이라고 한다.
플랫폼은 테스트를 실행해주는 런쳐를 제공해준다.
주피터는 Test Engine API 구현체로 JUnit 5를 제공한다.
빈티지는 JUnit 4와 3을 지원하는 TestEngine 구현체이다.
2. 시작하기
JUnit 5는 스프링 부트 2.2 이상의 버전을 사용하면 기본으로 의존성이 추가되므로 바로 사용이 가능하다.
테스트를 작성하고픈 클래스에서 ctrl + shift + T를 누르면 테스트를 바로 작성할 수 있다.
3. 애노테이션
@Test를 추가해야 테스트 메소드임을 명시하게 된다.
@BeforeAll / @AfterAll : 전체 메소드를 실행하기 전 / 후에 한 번만 실행되는 메서드를 명시할 때 사용한다.
@BeforeEach / AfterEach : 각각의 메소드를 실행하기 전 / 후에 항상 실행된다.
@Disabled : 해당 메서드를 실행하지 않는다.
@DisplayNameGeneration : 테스트 이름을 표기하는 방법을 설정한다. ReplaceUnderscores 를 설정하면 _를 제거해준다. 여러 방법이 있는 것 같으니 필요시 찾아서 사용해야겠다.
@DisplayName("abc") : 테스트 이름을 abc로 표기해준다.
@Enabled__, @Disabled__ : __에 OnOs, OnJre, If 등 여러 조건을 붙여서 해당 조건을 만족할 때 실행/무시를 설정할 수 있다. 예를들어 @EnabledOnOs(Os.window)는 윈도우환경에서만 실행하게 해준다.
@Tag : 테스트 메소드에 태그를 추가할 수 있다.
애노테이션을 생성해서 커스템 태그를 만들 수 있다.
위와같이 FastTest를 정의하고 원하는 메서드에 @FastTest를 붙이면 해당 애노테이션의 설정대로 메서드를 커스터마이징할 수 있다.
4. Assertion
다양한 메서드가 있다.
assertEquals(기대값, 실제값) : 기대값과 실제 값이 같은지 확인한다.
assertNotNull(실제값) : null인지 확인한다.
assertTrue(boolean) : 조건이 참인지 확인한다.
assertAll( assert__, assert__, assert__) : 조건을 모두 묶어서 모든 구문을 확인한다.
assertThrow() : 예외를 발생하는지 확인한다.
이 외에도 assert가 붙은 수 많은 메서드가 있다. 필요한 구문이 있으면 확인해서 사용해야겠다.
5. Test 순서
JUnit 5는 테스트 메소드마다 인스턴스를 새로 생성한다. 단위 테스트를 함에 있어, 메소드를 독립적으로 실행해서 부작용을 방지하기 위함이라고 한다. 그러나 같은 인스턴스 내에서 모든 테스트를 실행하고싶다면 @TestInstance(Lifecycle.PER_CLASS) 어노테이션을 통해 인스턴스 한개로 테스트를 사용할 수 있다.
JUnit 5 는 일단 순서에따라 메서드를 테스트한다고는 하지만 이를 너무 믿으면 안된다. 순서를 지정하고 싶다면
@TestMethodOrder(MethodOrderer.OrderAnnotation.class) 어노테이션을 클래스 위에 선언하고
원하는 메서드 위에 @Order(숫자) 로 순서를 지정할 수 있다.