스프링에서 테스트(Test) 환경을 설정하고 테스트를 수행하는 방법은?
_____A1: 스프링 부트 프로젝트에서는 보통 `spring-boot-starter-test` 의존성을 추가합니다. 이 스타터에는 JUnit, Mockito, AssertJ, Spring TestContext Framework 등이 포함되어 있어 테스트 작성에 필요한 대부분의 라이브러리를 제공합니다.
Maven 예시:
```xml
```
Q2: 스프링 테스트에서 기본으로 사용하는 테스트 러너(Test Runner)는 무엇인가요?
A2: 스프링 부트 2.4 이상부터는 기본적으로 JUnit 5(Jupiter)를 사용합니다. 기존에는 `@RunWith(SpringRunner.class)`를 썼지만, JUnit 5부터는 `@ExtendWith(SpringExtension.class)`가 사용됩니다. `@SpringBootTest` 애노테이션이 이를 내포하고 있어 별도 확장이 필요없습니다.
Q3: 스프링에서 통합 테스트 환경을 설정하려면 어떤 애노테이션을 사용하나요?
A3: `@SpringBootTest`를 사용합니다. 이 애노테이션은 애플리케이션 컨텍스트를 로딩하고 전체 스프링 환경을 구성하여 통합 테스트를 수행할 수 있게 합니다. 예:
```java
@SpringBootTest
public class MyServiceIntegrationTest {
// 테스트 코드
}
```
Q4: 특정 빈(Bean)만 테스트할 때는 어떻게 설정하나요?
A4: `@WebMvcTest`, `@DataJpaTest`, `@MockBean` 등 슬라이스 테스트(Slice Test) 애노테이션을 사용하면 필요한 영역의 빈만 로딩하여 가볍게 테스트할 수 있습니다. 예:
- `@WebMvcTest` : 컨트롤러 및 MVC 관련 빈만 로드
- `@DataJpaTest` : JPA 리포지토리 관련 빈만 로드 및 인메모리 DB 설정
- `@MockBean` : 특정 빈을 목(Mock) 빈으로 교체
Q5: 테스트 실행 시 애플리케이션 프로퍼티 설정을 다르게 하고 싶으면 어떻게 하나요?
A5: `@TestPropertySource` 애노테이션을 사용하거나, `@SpringBootTest(properties = "key=value")` 속성을 사용하면 테스트 시 커스텀 프로퍼티를 적용할 수 있습니다.
예:
```java
@SpringBootTest(properties = {"app.mode=test"})
@TestPropertySource(locations = "classpath:test.properties")
```
Q6: 테스트에서 특정 프로파일만 활성화하려면 어떻게 하나요?
A6: `@ActiveProfiles("test")` 애노테이션을 테스트 클래스에 붙이면 해당 프로파일이 활성화된 상태로 컨텍스트가 로딩됩니다.
Q7: 스프링 테스트에서 Mockito를 연동하려면 어떻게 해야 하나요?
A7: `@MockBean` 애노테이션을 사용하여 스프링 빈을 목 객체로 등록할 수 있습니다. 예:
```java
@MockBean
private MyRepository myRepository;
```
이를 통해 실제 빈 대신 가짜(목) 빈을 주입받아 테스트할 수 있습니다.
Q8: 테스트 데이터베이스를 별도로 사용하려면 어떻게 설정하나요?
A8: 테스트용 설정 파일(ex. `application-test.properties`)에 별도의 데이터베이스 연결 정보를 작성하고, 테스트 클래스에 `@ActiveProfiles("test")`를 지정하면 테스트 시 해당 설정을 사용합니다. 또는 `@DataJpaTest`와 같이 인메모리 DB(H2 등)를 자동으로 띄우는 슬라이스 테스트를 사용할 수 있습니다.
Q9: 테스트 실행 시 매번 새로운 애플리케이션 컨텍스트를 로딩하지 않도록 하는 방법은?
A9: 스프링 테스트는 기본적으로 캐시된 컨텍스트를 재사용합니다. 클래스타입과 활성 프로파일, 프로퍼티 등이 다르면 다른 컨텍스트를 로드하므로, 설정이 동일하다면 자동으로 재사용됩니다. `@DirtiesContext`가 붙으면 캐시 무효화가 발생하니 주의하세요.
Q10: 스프링 테스트 내에서 HTTP 요청 테스트는 어떻게 하나요?
A10: `@WebMvcTest` 또는 `@SpringBootTest(webEnvironment = WebEnvironment.MOCK)`와 함께 `MockMvc`를 사용해 컨트롤러 레벨에서 HTTP 요청을 시뮬레이션할 수 있습니다.
예:
```java
@Autowired
private MockMvc mockMvc;
@Test
public void testGetEndpoint() throws Exception {
mockMvc.perform(get("/api/data"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.name").value("test"));
}
```
---
요약하자면, 스프링 테스트 환경 설정은 `spring-boot-starter-test` 의존성 추가 → `@SpringBootTest` 또는 슬라이스 테스트 애노테이션 사용 → 목(Mock) 빈 설정 및 프로파일/프로퍼티 활용 → 필요한 테스트 도구(MockMvc 등) 활용 순서로 진행합니다.
스프링은 강력한 테스트 지원 기능을 제공하며, 이를 통해 애플리케이션의 다양한 구성 요소를 쉽게 테스트할 수 있습니다.
아래는 스프링에서 테스트 환경을 설정하고 테스트를 수행하는 기본적인 방법입니다.
1. 테스트 의존성 추가먼저, Maven 또는 Gradle을 사용하여 테스트 관련 의존성을 추가해야 합니다.
스프링 부트 프로젝트의 경우, `spring-boot-starter-test` 의존성을 추가하면 됩니다.
Maven 예시: ```xml
2. 테스트 클래스 작성스프링에서는 JUnit과 Mockito를 사용하여 테스트를 작성할 수 있습니다.
테스트 클래스는 `@SpringBootTest` 애너테이션을 사용하여 스프링 컨텍스트를 로드합니다.
```javaimport org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import static org.assertj.core.api.Assertions.assertThat;@SpringBootTestpublic class MyServiceTest { @Autowired private MyService myService; @Test public void testServiceMethod() { String result = myService.someMethod(); assertThat(result).isEqualTo("Expected Result"); }}```
3. Mocking 사용하기스프링에서는 Mockito를 사용하여 의존성을 모킹(mocking)할 수 있습니다.
`@MockBean` 애너테이션을 사용하여 테스트 중에 특정 빈을 모킹할 수 있습니다.
```javaimport org.junit.jupiter.api.Test;import org.mockito.Mockito;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.boot.test.mock.mockito.MockBean;@SpringBootTestpublic class MyServiceTest { @Autowired private MyService myService; @MockBean private DependencyService dependencyService; @Test public void testServiceMethodWithMock() { Mockito.when(dependencyService.someMethod()).thenReturn("Mocked Result"); String result = myService.someMethod(); assertThat(result).isEqualTo("Expected Result"); }}```
4. 통합 테스트스프링에서는 통합 테스트를 쉽게 수행할 수 있습니다.
`@SpringBootTest` 애너테이션을 사용하면 전체 애플리케이션 컨텍스트를 로드하여 실제 데이터베이스와의 통신을 포함한 테스트를 수행할 수 있습니다.
```java@SpringBootTest@AutoConfigureMockMvcpublic class MyControllerTest { @Autowired private MockMvc mockMvc; @Test public void testGetEndpoint() throws Exception { mockMvc.perform(get("/api/resource")) .andExpect(status().isOk()) .andExpect(content().string(containsString("Expected Content"))); }}```
5. 테스트 실행테스트는 IDE에서 직접 실행하거나, Maven 또는 Gradle을 통해 커맨드라인에서 실행할 수 있습니다.
- Maven: `mvn test`- Gradle: `gradle test`
6. 테스트 커버리지 확인JUnit과 함께 Jacoco와 같은 도구를 사용하여 테스트 커버리지를 확인할 수 있습니다.
Maven 또는 Gradle에서 Jacoco 플러그인을 설정하여 테스트 커버리지를 쉽게 분석할 수 있습니다.
결론스프링에서 테스트 환경을 설정하고 테스트를 수행하는 것은 비교적 간단합니다.
위에서 설명한 방법을 통해 단위 테스트와 통합 테스트를 작성하고 실행할 수 있습니다.
테스트는 애플리케이션의 품질을 보장하는 중요한 과정이므로, 적극적으로 활용하는 것이 좋습니다.
작성자:
ㅁㅁ [비회원]
| 작성일자: 1년 전
2024-08-26 08:20:38
조회수: 239 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 239 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.