ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SPRINGBOOT]테스트코드 작성
    SPRINGBOOT 2022. 4. 4. 02:02

    참조 : 스프링부트와 AWS로 혼자 구현하는 웹 서비스(이동욱 저)

     

    CH2. 스프링 부트에서 테스트 코드를 작성하자

     

    1. 테스트 코드 소개

     

    * TDD

    Test Driven Development의 약자로 테스트 주도 개발이라고 한다. 

    작은 단위의 테스트 테이스를 작성하고 이를 통과하는 토드를 추가하는 단계를 반복하여 구현한다.

     

    - 항상 실패하는 테스트를 먼저 작성

     

    - 테스트가 성공하는 프로덕션 코드를 작성

     

    - 테스트가 통과하면 프로덕션 코드를 리팩토링

     

     

    * 단위 테스트 : 기능단위의 테스트 코드를 작성하는 것

     

    테스트 코드를 작성하는 이유

    - 단위 테스트는 개발단계 초기에 문제를 발견하게 해준다.

    - 단위 테스트는 개발자가 나중에 코드를 리팩토링 하거나 라이브러리 업그레이드 등에서 기존 기능이 올바르게 작동하는지 확인할 수 있다.

    - 단위 테스트는 기능에 대한 불확실성을 감소시킬 수 있다.

    - 단위 테스트는 시스템에 대한 실제 문서를 제곤한다. 

    - 빠른 피드백

    - 자동검증

    - 개발자가 만든 기능을 안전하게 보호(새로운 기능이 추가될 때 기존 기능이 잘 작동되는 것을 보장)

     

    앞으로 자바용 테스트 프레임워크인 JUnit을 사용하도록 할 것이다.

     

    2. 테스트 코드 작성하기

     

    ① 자바 디렉토리 밑에 패키지를 생성해준다.

    ② 웹 사이트 주소의 역순으로 패키지 명을 설정한다.

    ③ 해당 패키지 밑에 JAVA 클래스를 생성한다.

    ④ 클래스 명을 설정한다.

    ⑤ 코드를 작성한다.

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    //@SpringBootApplication이 있는 위치부터 설정을 읽기 때문에 해당 클래스는 프로젝트의 최상단에 위치
    @SpringBootApplication //스프링부트의 자동설정, 스프링Bean 읽기와 생성을 자동으로 설정
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args); // SpringApplication.run로 내장 WAS 실행
        }
    }

    내장 WAS란 별도로 외부에 WAS를 두지 않고 애플리케이션을 실행할 때 내부에서 WAS를 실행하는 것이다.

    즉, 톰캣을 설치할 필요가 없다.

    스프링 부트에서 내장 WAS 사용이 권장되는 이유는 언제 어디서나 같은 환경에서 스프링 부트를 배포할 수 있기 때문이다.

     

    ⑥ 현재 패키지에 하위 패키지 'web'을 만들어준다.

     컨트롤러와 관련된 쿨래스들을 모두 이 web패키지에 담을 것이다.

     

    ⑦ web 패키지 밑에 'HelloController'라는 컨트롤러(JAVA 클래스)를 만들어준다.

    ⑧ API 만들기

    package com.study.crystal.test.web;
    
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController //컨트롤러를 JSON을 반환하는 컨트롤러로 만들어줌
    public class HelloController {
        @GetMapping("/hello") //HTTP Method인 Get의 요청을 받을 수 있는 API를 만들어줌
        public String hello(){
            return "hello";
        }
    }

    ⑨ src/test/java 밑에 똑같은 패키지를 생성해준다.

     

    ⑩ 테스트 코드를 작성할 클래스를 생성한다. 

    보통은 대상 클래스 이름에 Test를 붙여서 생성한다.

    ⑪  테스트 코드를 작성한다.

    package com.study.crystal.test.web;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
    import org.springframework.test.context.junit4.SpringRunner;
    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;
    
    //스프링 부트 테스트와 JUnit 사이에 연결자 역할을 함 
    //SpringRunner라는 스프링실행자를 사용한다는 의미
    @RunWith(SpringRunner.class)
    
    @WebMvcTest(controllers = HelloController.class) // 스프링 어노테이션 중 웹에 집중할 수 있는 어노테이션
    public class HelloControllerTest {
        //빈 주입 어노테이션
        @Autowired
        //웹 API 테스트할 때 사용
        //스프링 MVC 테스트의 시작점
        // 이 클래스를 통해 HTTP, GET, POST 등에 대한 API 테스트가 가능
        private MockMvc mvc; 
    
        @Test
        public void hello가_리턴된다() throws Exception {
            String hello = "hello";
            //MockMvc를 통해 /hello 라는 주소로 HTTP GET 요청
            //체이닝 지원
            mvc.perform(get("/hello")).
            		//mvc.perform의 결과를 검증
                    	//HTTP Header의 Status를 검증(200, 404, 500등의 상태)
            		andExpect(status().isOk()). //Ok, 즉 200인진 아닌지 검증
                    	//응답 본문의 내용을 검증
                    	andExpect(content().string(hello)); //Controller에서 "hello"를 리턴하는지 검증
    
        }
    }

    ⑬⑫ 왼쪽의 화살표를 눌러 테스트 코드를 실행한다.

    검증 성공!

    ⑬ 수동 실행한다.

    Application 클래스의 main함수 옆 화살표를 눌러 실행시켜준다.

    실행 시키면 8080 포트로 톰캣서버가 실행되었다고 로그가 찍힌다.

    ⑭ 브라우저를 통해 확인!

    수동으로 검증하고 테스트 코드를 작성하는 것이 아니다. 

    테스트 코드로 먼저 검증을 한 후, 정말 결과에 대한 신뢰가 없을 때 직접 프로젝트를 실행시켜 확인을 한다.

Designed by Tistory.