[SpringBoot] SpringBoot 테스트 코드 작성하기
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에 대해서 작성해보아야 겠다.
출처