본문 바로가기
개발/SpringBoot

SpringBoot에서 테스트 코드 작성하기 [스프링 부트와 AWS로 혼자 구현하는 웹서비스] - 스프링부트

by 뾰료롱 2024. 6. 13.

[스프링 부트에서 테스트 코드를 작성하자]

오늘은 "스프링 부트와 AWS로 혼자 구현하는 웹서비스" 책의 2장인 테스트코드를

작성 방법에 대해 알아보도록 하겠습니다.


[테스트 코드 소개]

TDD (Test-driven development): 테스트 주도 개발로 선 개발후 테스트 하는 방식이 아닌 선 테스트후 개발하는 방식을 말한다.

단위 테스트 (Unit Test): TDD의 첫번째 단계인 기능 단위의 테스트 코드를 작성하는것

 

테스트코드에는 위와 같은 내용이 있다고 책에서 얘기하고 있다.

나는 솔직히 정확히 무슨 말인지 아직 잘 이해가 안 된다.. 학원을 통해 속성으로 실무내용만 배웠던 터라

이런 단어는 조금 더 어렵게 느껴진다.. 책을 통해 모르는 단어나 내용을 배울 수 있는 계기가 되면 좋겠다.

 

[테스트 코드의 장점]

1. 수동검증의 불편함 없이 자동검증이 가능
2. 개발자가 만든 기능을 안전하게 보호

테스트 코드를 작성함으로써 위 같은 장점이 있다고 한다.

책을 보며 제일 매력적으로 다가왔던 말은 2번 내용이었다.

자세한 내용을 말하자면, 새로운 기능이 추가될 때, 기존 기능이 잘 작동되는 것을 보장해준다고 한다.

회사에서 기능개선등을 이유로 신규로 추가 기능을 개발하거나 기존 기능을 유지보수 하다 오류를 낸 적이 많았었는데..

이걸 이용하면 그럴 일이 없다는 건가.. 싶어서 한번 책 내용을 따라 해 보고 후기를 마지막에 공유하도록 하겠습니다.

 

[Hello Controller 컨트롤러 생성하기]

1장에서 생성한 프로젝트 패키지를 하나 생성하도록 하자.

프로젝트 내부에 java 디렉터리 > 생성되어 있는 패키지를 우측 클릭하여 New > Package를 차례로 선택!

패키지 경로를 확인하자

 

선택을 했다면 아래와 같이 패키지 명을 입력하는 창이 뜨게 된다.

web이라는 패키지를 생성해 보자

 

위에 생성된 패키지에는 이제 컨트롤러와 관련된 클래스들을 담을 예정입니다.

이제 해당 패키지에 컨트롤러를 만들어 보겠습니다.

생성한 web 패키지 선택 후 우측클릭 후 컨트롤러 명은 HelloController로 생성해 보자. 

 

컨트롤러를 생성하였다면 아래와 같이 코드를 작성하여 간단한 API를 만들어 보자.

package com.example.demo2.web;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello() {
        return "Hello World";
    }
    /*
    * @RestController
    * :컨트롤러를 JSON을 반환하는 컨트롤러로 만들어줌.
    * 
    * @GetMapping
    * :HTTP Method인 Get의 요청을 받을수 있는 API를 만들어줌 
    * 
    * */
}

 

[HelloController의 테스트 코드 작성하기]

위와 같이 작성을 했다면 해당코드가 정상적으로 작동하는지 테스트를 해봅시다.

WAS를 실행하지 않고 테스트 코드로 검증을 진행해 보도록 하겠습니다.

 

먼저 src/test/java 디렉터리에 위에 생성했듯이 패키지를 생성하고 

패키지안에 HelloControllerTest로 테스트 컨트롤러를 생성해 줍니다.

 

생성 완료했다면 아래와 같이 코드를 작성해 주자

package com.example.demo2.web;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.servlet.MockMvc;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@ExtendWith(SpringExtension.class)
@WebMvcTest(controllers = HelloController.class)
public class HelloControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void hello() throws Exception {
        String hello = "Hello World";

        mockMvc.perform(get("/hello"))
                .andExpect(status().isOk())
                .andExpect(content().string("Hello World"));
    }

    /*
    * 코드 설명
    * @ExtendWith
    * : 책에서는 @RunWith로 알려주지만 이제 ExtendWith 또는 SpringBootTest 사용한다고 한다.
    *   기능은 별차이가 없다고 하며 테스트를 진행할 때 JUnit에 내장된 실행자 외에 다른 실행자를 실행시킨다고 한다.
    *   즉, 스프링 부트 테스트와 JUnit 사이에 연결 역할을 한다.
    * 
    * @WebMvcTest
    * : Web(Spring MVC)에 집중할 수있는 어노테이션
    * 
    * @Authwired
    * : 스프링이 관리하는 빈(bean)을 주입 받는 어노테이션
    * 
    * private MockMvc mvc
    * : 이 클래스를 통해 HTTP GET,POST 등에 대한 API 테스트를 할수있음.
    * 
    * mvc.perform(get("/hello"))
    * : MockMvc를 통해 /hello 주소로 HTTP GET요청을 수행함.
    * 
    * .andExpect(status().isOK())
    * : mvc.perform의 결과를 검증. 해당소스에서는 HTTP header의 Status가 200인지 확인.
    * 
    * .andExpect(content().string("Hello World"))
    * : Controller에서 "Hello World"를 리턴하며 해당 리턴값이 맞는지 검증하는 역활
    * */


}

 

코드 설명이 들어가서 길어 보일 수 있지만 코드 자체는 간단하다.

테스트 코드를 모두 입력하였다면, 아래 이미지처럼 메서드 왼쪽의 화살표를 눌러 실행해 봅시다.

실행버튼을 눌러 메서드를 실행했을 때 아래 이미지의 빨간 영역처럼 표시되면 

정상적으로 통과한 걸로 확인할 수 있습니다.

참 쉽지요?

그렇다면 이제 수동으로 실행했을 때 정상적으로 값이 출력되는지 확인을 해보도록 하겠습니다.

src/main/java/패키지 경로에 있는 Appication.java 파일로 이동하여,

main 메서드 옆에 있는 왼쪽 화살표를 눌러 Run 'Application.main()'을 클릭하여 실행합니다.

실행했을 때 아래 consloe창에 아래와 같이 실행되는지 확인합니다.

 

정상적으로 실행되었다면, 인터넷 창을 실행한 후

URL입력창에 "http://localhost:8080/hello"를 입력해 봅시다.

수동으로 실행하여도 "Hello World"가 정상적으로 출력되는 걸 확인할 수 있습니다.

따라서 테스트 코드 결과와 같은 걸 알 수 있습니다.

 


끝으로..

나는 회사에서 스프링 부트 프레임워크를 사용하지 않아

해당 기능이 말하는걸 제대로 이해하기가 좀 어려웠다.

다만 API 테스트를 WAS에서 테스트하는 게 아닌 로컬에서 어느 정도 검증을 할 수 있는 방법을 배운 거 같다.

그리고 더 심화된 내용을 알게 된다면, 개발 후 테스트에 도움이 될 거 같은 생각도 든다..