Keep-Going-Web-Study / BE-Spring-Test-Guide

인프런 강의를 중심으로 Spring 테스트에 대해 학습합니다.
0 stars 0 forks source link

[Info] 단위 테스트 개념 #8

Open JadeKim042386 opened 4 months ago

JadeKim042386 commented 4 months ago

공유 내용

인프런 강의 질문 중 단위 테스트 개념에 대한 질문이 있고 해당 질문에 대한 강사의 답변이 도움이 될 것 같아 공유드립니다.

공유 정보

JisuPark-dev commented 4 months ago

좋은 내용 공유 감사합니다. 단위, 통합 개념이 햇갈렸었는데, 확 이해가 되었습니다. 아직 통합테스트는 작성해보지 않아서 구체적으로 어떤 것인지 모르겠긴 합니다.

JisuPark-dev commented 4 months ago

주문과 관련된 통합테스트 예시를 생성해달라고 해봤습니다.

@SpringBootTest
@AutoConfigureMockMvc
public class OrderIntegrationTest {
    @Autowired
    private MockMvc mockMvc;
    @Autowired
    private ObjectMapper objectMapper;
    @Test
    public void createAndRetrieveOrderTest() throws Exception {
        // Create an order
        Order order = new Order();
        order.setProduct("Laptop");
        order.setQuantity(1);

        mockMvc.perform(post("/orders")
                .contentType(MediaType.APPLICATION_JSON)
                .content(objectMapper.writeValueAsString(order)))
                .andExpect(status().isOk());

        // Retrieve all orders
        mockMvc.perform(get("/orders"))
                .andExpect(status().isOk())
                .andExpect(content().contentType(MediaType.APPLICATION_JSON))
                .andExpect(content().json("[{'product':'Laptop','quantity':1}]"));
    }
}

이런 예시가 있는데, 약간 시나리오 대로 잘 작동하는지 본다는 느낌이 있네요.

JadeKim042386 commented 4 months ago

@JisuPark-dev 올려주신 생성 코드를 보니 MockMvc로 API 요청을 보내고 정상적으로 반환되는지 확인하는 것 같은데, @SpringBootTest를 사용해서 order를 조회하는 로직이 있는 클래스를 모킹하는 대신 inject 해준 것 같습니다.

그런데 post("/orders")과 get("/orders")를 같은 메소드에서 같이 테스트하는게 맞을까요? order를 추가하는 시나리오와 조회하는 시나리오를 분리하는게 맞지 않을까요?

JisuPark-dev commented 4 months ago

주문 Service가 patientRepository와 orderRepository 두 가지 Repository에 의존하고 있는 상황에서 이를 테스트하는 것은 대부분의 경우 통합 테스트에 해당합니다. 단위 테스트와 통합 테스트의 차이는 주로 다음과 같은 기준에 따라 나뉩니다:

단위 테스트 (Unit Test):

단일 컴포넌트나 클래스의 동작을 테스트합니다. 외부 의존성을 Mocking하거나 Stubbing하여 독립적인 테스트 환경을 구성합니다. 빠른 피드백을 제공하며, 주로 비즈니스 로직의 올바름을 검증하는 데 사용됩니다. 통합 테스트 (Integration Test):

여러 컴포넌트가 함께 동작하는 방식을 테스트합니다. 실제 의존성을 사용하거나, 일부 의존성을 실제로 동작시키는 환경에서 테스트를 진행합니다. 시스템의 다양한 부분이 함께 올바르게 동작하는지 검증합니다. 주문 Service가 두 가지 Repository에 의존하는 경우, 이를 실제 Repository 구현체와 함께 테스트하는 것은 통합 테스트에 가깝습니다. 왜냐하면, 이는 단일 컴포넌트가 아닌 여러 컴포넌트 간의 상호작용을 검증하기 때문입니다.