JUnit: 기본 사용법

메밀·2023년 9월 13일
0

드디어 테스트를 배우기로 결정했다!

1. JUnit?

  • 단위 테스트(unit test) 지원 프레임워크
  • assert 메소드로 테스트 수행 결과 판별
  • @Test 메소드가 호출될 때마다 새로운 인스턴스를 생성하여 독립적인 테스트

1) dependency: spring-boot-test

스프링 이니셜라이저로 생성한 경우 거의 따로 설정 필요X

  • spring-boot-test가 포함하는 것들
    • JUnit 5
    • AssertJ: assertion 라이브러리
    • Hamcrest: matcher 라이브러리(값 비교 편리하게) -> 테스트 표현식을 도와주는 라이브러리
    • Mockito: 가짜(mock) 객체 생성해서 테스트
    • JSONassert: JSON assertion 라이브러리
    • 등등...

2. 기본 사용법

1) Test class 만들기

클래스 선언부에 커서 > 마우스 우클릭 > Go To > Test > Create Test

2) @WebMvcTest vs. @SpringBootTest

@WebMvcTest@SpringBootTest
Controller(API) 레이어만을 테스트하기에 적합실제 어플리케이션을 로컬 위에 올리고, 포트와 DB 커넥션이 붙은 상태에서 진행하는 테스트

3) JUnit5 어노테이션

어노테이션내용
@Test테스트 메소드임을 선언
@ParameterizedTest매개변수를 받는 테스트
@RepeatedTest반복되는 테스트
@TestFactory동적 테스트 (cf. @Test: 정적 테스트)
@TestMethodOrder테스트 메소드 실행 순서
@DisplayName테스트 클래스/메소드의 사용자 정의 이름
@BeforeEach모든 테스트 실행 전에 실행할 테스트
@AfterEach-
@BeforeAll현재 클래스 실행 전 제일 먼저 실행할 테스트(static)
@AfterAll현재 클래스 종료 후 실행할 테스트
@Disabled-

4) JPA 테스트

- @DataJpaTest

  • spring.jpa.show-sql=true가 아니어도 showSql()을 사용해서 쿼리 확인 가능
  • default로 transactional, rollback
    • @Transactional(propagation = Propagation.NOT_SUPPORTED)로 끌 수 있음

- TestEntityManager

테스트용 EntityManager

- @AutoConfigureTestDatabase

실제 데이터베이스로 테스트

@DataJpaTest
@AutoConfigureTestDatabase(replace = Replace.NONE)
class MyRepositoryTests {

    // ...

}

5) Jupiter API: assert 메소드

org.junit.jupiter.api.Assertions 클래스는 값 검증을 위한 assert로 시작하는 static 메소드 제공

  • assertEquals(expected, actual): 기본타입/Object에 대한 동등성 검사
  • assertNotEquals(Object unexpected, Object actual)
  • assertTrue(boolean condition)
  • assertFalse(boolean condition)
  • assertNull(Object actual)
  • assertNotNull(Object actual)
  • assertAll(): 여러개 검증
  • assertThrows(ArithmeticException.class, () -> divide(100, 0)): 실행한 코드에서 특정 익셉션이 발생하는지 확인

6) JUnit5 Assumptions

특정 조건이 충족되는 경우에만 테스트

  • assumeTrue(), assumeFals(), assumingThat()

- 예시

public class AssumptionTest {

    @Test
    @DisplayName("window에서 테스트 실행")
    void runTest_IfWindonw() {
        assumeTrue(System.getProperty("os.name").startsWith("Windows"));
        assertEquals(2, 2);
    }

    @Test
    @DisplayName("linux에서 테스트 실행")
    void runTest_IfLinux() {
        assumeTrue(() -> System.getProperty("os.name").startsWith("Linux"));
        assertEquals(2, 2);
    }

    @Test
    @DisplayName("지정한 가정을 충족한 경우 지정한 검증을 수행")
    void runTest() {
        String osName = System.getProperty("os.name");
        assumingThat(
                osName.startsWith("Linux"), // (1) 가정 boolean 또는 BooleanSupplier
                () -> assertEquals(1, 2) // (2) 가정을 충족할 때 실행할 코드(Executable 타입)
        );
        assertEquals(1, 1); // (3)
    }
}

출처
https://docs.spring.io/spring-boot/docs/2.7.5/reference/html/features.html#features.testing.spring-boot-applications.autoconfigured-spring-data-jpa

https://spring.io/guides/gs/testing-web/

https://insight-bgh.tistory.com/507

https://blog.neonkid.xyz/272

0개의 댓글