[SpringBoot] SpringBoot 테스트 코드 작성하기

Cover image

SpringBoot 테스트 코드

대학교 시절, 프론트 위주 개발을 하다가 스프링 개발을 하다보니 가장 어려웠던 점은 테스트 코드를 작성하는 부분이였다.

테스트 코드를 작성할 때, 여러 어노테이션이 등장하고 이 부분에 대한 개념도 없다는 것을 느끼고 있다. (다음 게시물은 아마 스프링 어노테이션에 대해서 작성할 예정이다.)

간략하게라도 글을 통해 정리하고, 이후 점차 추가해가는 방향으로 진행해야겠다.


JUnit

Junit의 특징.

  • JUnit은 자바용 단위 테스트 작성을 위한 표준 프레임워크다.
  • xUnit이라는 단위 테스트 프레임워크의 자바 구현물이다.
  • 테스트 도구이며 외부 테스트 프로그램을 작성해 할 필요 없이 이를 관리해줄 수 있따.
  • 하나의 jar파일로 되어 있으며 사용법 또한 간단하다
  • 테스트 결과를 확인하는 것 뿐만 아니라 최적화된 코드를 유추하는 기능도 있어서 성능향상을 기대할 수 있따.
  • Test 클래스를 통해 다른 개발자에게 테스트 방법과 클래스 히스토리를 알려줄 수 있다.

JUnit에서 테스트를 지원하는 어노테이션(Annotation)

  • @Test

    • @Test 가 선언된 메서드는 테스트를 수행하는 메소드가 된다.
    • JUnit은 각각의 테스트가 서로 영향을 주지 않고, 독립적으로 실행됨을 원칙으로 하며, @Test마다 객체를 생성한다.
  • @Ignore

    • @Ignore가 선언된 메서드는 테스트를 실행하지 않는다.
  • @Before

    • @Before가 선언된 메서드는 @Test 메서드가 실행되기 전에 반드시 실행된다.
    • @Test메서드에서 공통으로 사용하는 코드를 @Before 메서드에 선언하여 사용하면 된다.
  • @After

    • @After가 선언된 메서드는 @Test 메서드가 실행된 후 실행된다.
  • @BeforeClass

    • @BeforeClass 어노테이션은 @Test 메서드보다 먼저 한번만 수행되어야 할 경우에 사용된다.
  • @AfterClass

    • @AfterClass 어노테이션은 @Test 메서드보다 나중에 한번만 수행되어야 할 경우에 사용된다.

JUnit4와 Junit5는 테스트 어노테이션이 서로 다르다.

: 해당글 참고 예정 : https://pureainu.tistory.com/190

자주 사용하는 JUnit 메서드

메서드 기능
assertEquals(a,b) 객체 a, b의 값이 일치하는 지 확인
assertArrayEquals(a,b) 배열 a, b의 값이 일치하는 지 확인
assertSame(a,b) 객체 a, b가 같은 객체인지를 확인
두 객체의 레퍼런스가 동일한지 확인
assertTrue(a) 조건 a가 참인가를 확인
assertNotNull(a) 객체 a가 null이 아님을 확인

Springt-Test 어노테이션

  • @RunWith(SpringJUnit4ClassRunner.class)

    • @RunWith 어노테이션을 사용함으로써, JUnit에 내장된 러너를 사용하는 대신 어노테이션에 정의된 러너 클래스를 사용
    • JUnit 프레임워크의 테스트 실행방법을 확장할 때 사용하는 어노테이션이다.
    • @RunWith를 사용하기 위해선 JUnit 실행에 필요한 SpringJUnit4ClassRunner 클래스를 상속받은 @RunWith(SpringRunner.class)를 꼭 붙여서 사용해야 한다.
    • @RunWith 어노테이션은 각각의 테스트 별로 객체가 생성되더라도 싱글톤(Singletone)의 ApplicationContext를 보장한다.
    • @RunWith 어노테이션은 JUnit4에서 주로 사용하는 것으로 알고 있고, JUnit5의 경우에는 @ExtendWith를 사용한다.
  • @ContextConfiguration

    • 스프링 빈(Bean) 설정 파일의 위치를 지정할 때 사용하는 어노테이션이다.
  • @Autowired

    • 스프링 DI에서 사용하는 어노테이션이다.
    • 해당 변수에 자동으로 빈(Bean)을 매핑해준다.
    • 스프링 빈(Bean) 설정 파일을 읽기 위해 GenericXmlApplicatoinContext를 사용할 필요가 없다
    • 변수, setter 메서드, 생성자, 일반 메서드에 적용 가능하다.
    • 의존하는 객체를 주입할 때는 주로 Type을 사용한다.
    • , 태그와 동일한 역할을 한다.
  • @SpringBootTest

    • 통합 테스트를 제공하는 기본적인 스프링 부트 테스트 어노테이션이다.
    • 여러 단위의 테스트를 하나의 통합된 테스트로 수행할 때 적합한 어노테이션이다.
    • 만능 테스트 어노테이션으로 하고 싶은 모든 테스트를 수행할 수 있다.
    • 애플리케이션에 설정된 빈을 모두 로드하기 때문에 규모가 클 수록 느려지는 단점이 있다.
  • @WebMvcTest

    • MVC를 위한 테스트 어노테이션이다.
    • 웹에서 테스트하기 힘든 Controller를 테스트하는 데 적합하고 웹 상의 요청 또는 응답에 대해 테스트할 수 있다.
    • @WebMvcTest를 사용하면 MVC 관련 설정인 어노테이션만 불러오기 때문에 @SpringBootTest보다 가벼운 테스트가 가능
  • @DataJpaTest

    • JPA 관련 테스트 설정만 로드하는 어노테이션이다.
    • 데이터 소스의 설정이 정상적인지 JPA를 사용하여 데이터를 제대로 CRUD 하는지 테스트가 가능하다.
    • @Entity 어노테이션을 스캔하여 Spring Data JPA 저장소를 구성한다.
    • 실제 데이터 베이스 공간을 사용하지 않고, 내장형 데이터 베이스 공간을 사용하여 테스트하기 때문에 JPA 테스트 이후 실제 데이터 베이스가 변경 되었는지 걱정할 필요가 없다.
  • @RestClientTest

    • REST 관련 테스트를 도와주는 어노테이션이다.
    • REST 통신의 데이터 형식으로 주로 사용되는 JSON 형식에 대해서 제대로 응답을 반환하는지 등을 테스트 한다.
  • @Json Test

    • JSON 테스트를 지원하는 어노테이션이다.
    • @JsonTest 어노테이션은 JSON의 직렬화와 역직렬화를 수행하는 라이브러리인 Gson과 Jackson API 테스트를 제공한다.

마무리.

다음과 같이 스프링 테스트에서 사용하는 어노테이션에 대해서 간단하게 정리하였다.

이후에는 mock과 mockito에 대해서 작성해보아야 겠다.


출처