본문 바로가기

Back-end & Server/Spring Boot with Kotlin

[Spring Boot] Testing

728x90
반응형

 

Springboot는 기본적으로 JUnit을 지원한다.

 

JUnit은 자바에서 가장 널리 사용되는 단위 테스트 프레임워크다.

테스트 주도 개발(TDD: Test-Driven Development)의 핵심 도구로, 개발자가 소프트웨어를 개발하는 과정에서 발생할 수 있는 버그를 사전에 잡아내는 것을 돕는다.

 

주요기능은 다음과 같다.

 

1. TestCase

  • 테스트의 기본단위로, 한 번에 하나의 조건을 검사한다.
  • 각각의 테스트 케이스는 독립적으로 실행되며, 다른 테스트 케이스에 영향을 미치지 않아야 한다.

 

2. Test Suite

  • 여러 테스트 케이스를 그룹화한 것이다.
  • 테스트 케이스들을 한 번에 실행할 수 있다.

 

3. Assertion

  • 코드가 예상한 대로 동작하는지 검증하기 위해 사용된다.
  • ex. assertEquals(expected,actual) 메소드는 실제 값이 예상한 값과 같은지 확인한다.

 

4. Setup and Teardown

  • Setup은 각 테스트 케이스 실행 전에 준비 작업을 수행한다.
  • Teardown은 테스트 케이스 실행 후에 정리 작업을 수행한다.
  • JUnit에서는 @Before, @After 어노테이션을 사용하여 Setup과 Teardown 메소드를 정의한다.

 

5. Annotation

  • JUnit은 다양한 어노테이션을 제공하여 테스트 코드를 작성하는데 도움을 준다.
  • ex. @Test 어노테이션은 메소드가 테스트 케이스임을 나타냄, @Ignore 어노테이션은 해당 테스트 케이스를 실행하지 않도록 한다.

 

 

JUnit5 부터는 @BeforeEach, @AfterEach, @BeforeAll, @AfterAll 등의 새로운 어노테이션이 추가되었다.

  • 각각 테스트 메소드 실행 전/후, 모든 테스트 메소드 실행 전/후 수행될 메소드를 정의

 

이런 기능들을 이용하여 JUnit은 개발자가 코드의 정확성을 확신할 수 있게 도와준다.

또한, 리팩토링이나 기능 추가 등의 작업을 할 때도 기존 기능이 올바르게 동작하는지 확인하는 데 큰 도움이 된다.

 

 

Springboot에서 사용시 build.gradle.kt에 다음을 추가해야한다.

testImplementation("org.springframework.boot:spring-boot-starter-test")

일반적으로 Springboot에서 Junit을 사용하여 test를 할 때는 Mock을 사용한다.

 

Mock은 테스트 시 실제 구현 대신 사용되는 가짜 객체로 Mock 객체는 원하는 방식으로 동작하도록 프로그래밍되어 있고, 실제 의존성을 가지지 않고도 테스트를 수행할 수 있다.

 

Mock MVC

  • Spring MVC Application Testing을 위해 사용되는 클래스(MockMvc)
  • 이 클래스를 사용해 실제 Servlet 컨테이너를 실행하지 않고도, Spring MVC의 동작을 모방하여 HTTP 요청과 응답을 테스트 할 수 있다.
  • MockMvc는 Application의 Controller와 Client 사이에 위치, 클라이언트로부터의 요청을 받아서 Controller에 전달하고, 그 결과를 다시 Client에게 반환한다.
  • 이 과정에서 발생하는 모든 데이터는 메모리 상에 저장되기 때문에 테스트 시간을 크게 줄일 수 있다.
  • Spring Test 모듈의 MockMvcBuilders를 사용하면 MockMvc 인스턴스를 쉽게 생성할 수 있다.(ex. standaloneSetup()를 사용하면 특정 Controller만을 대상으로 하는 MockMvc를 만들 수 있다.)

 

 

예시

package com.springboot.kotlinexample
import org.junit.jupiter.api.Test
import org.springframework.boot.test.context.SpringBootTest

import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc
import org.springframework.test.web.servlet.MockMvc
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*
import org.springframework.test.web.servlet.result.MockMvcResultMatchers.*

@SpringBootTest
@AutoConfigureMockMvc
class KotlinexampleControllerTests {

	@Autowired
	private lateinit var mockMvc: MockMvc

	@Test
	fun `getAllUsers returns index view`() {
		mockMvc.perform(get("/users"))
			.andExpect(status().isOk)
			.andExpect(view().name("index"))
	}
}

728x90
반응형