Coding Note

스프링 부트 - 테스트 코드 작성하기! 본문

SpringBoot/AWS_PJ

스프링 부트 - 테스트 코드 작성하기!

jinnkim 2022. 2. 28. 23:23

 

 

악!!!!!!!!!!!!! 너무 어렵잖아..

오류 해결하는데 하루 걸렸다ㅠㅠ

 

그래도 해결했으니 다행이야!!

그럼 풀이해보자

 


 

 

1. 테스트 코드란?

- 자동 검증 가능

 - TDD와 단위 테스트는 다르다.

TDD 단위테스트
- 테스트가 주도하는 개발
- 구현 -> 테스트 -> 리팩토링
- 기능 단위의 테스트 코드 작성
- 테스트 코드만 작성함
- 개발 단계 초기 문제 발견 가능
- 자동 검증 가능
- 개발자가 만든 기능 보호
- 문서로 사용할 수 있음
- 톰캣 서버 내렸다가 다시 실행 반복 안해도 됨

 

 

 

2. HelloController 테스트 코드 작성하기

"스프링 부트의 AWS로 혼자 구현하는 웹 서비스" 책 기반임으로 JUnit4 버전을 사용하고 있다!

JUnit4 버전 확인 및 수정은 전 게시물을 통해서 확인할 수 있다.

 

[src -main - java - New - Package] 패키지를 생성한다.

패키지 명은 웹 사이트 주소 역순으로 작성한다.

 

클래스 생성하기

[new - java class] 클래스 이름은 Application으로 지정한다.

 

 

- Application

package com.bs.book.springboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

 

 

@SpringBootApplication

- 스프링 부트 자동 설정, 스프링 Bean 읽기와 생성 모두 자동으로 설정된다.

- 이 클래스 기준으로 설정을 읽어가기 때문에 항상 프로젝트의 최상단에 위치해야만 한다.

 

 

Q1. 내장 WAS (Web Application Server, 웹 애플리케이션 서버)

- 외부에 WAS를 두지 않고 애플리케이션을 실행할 때 내부에서 WAS를 실행하는 것

- 즉, 서버에 톰캣을 설치할 필요가 없게 되므로 Jar 파일로 실행하면 된다.(시간 효율)

 

 

위 패키지 아래  Web 패키지를 생성합니다.

 

 

 

- Web

package com.bs.book.springboot.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";
    }
}

 

@RestController

- 컨트롤러를 JSON을 반환하는 컨트롤러로 만들어 준다.

- @ResponseBody 각 메서드마다 선언했던 것을 한 번에 사용할 수 있게 해주는 클래스

 

 

@GetMapping

- HTTP Method인 Get의 요청을 받을 수 있는 API를 만들어 준다.

- @RequestMapping(method =RequestMethod.GET) 대체

 

 

그럼 HelloControllerTest를 진행해보자!

 

[src -main - test - java - New - Package] 패키지를 생성한다.

패키지에 'HelloControllerTest' 클래스를 생성한다.

 

 

 

 

- HelloControllerTest

package com.bs.book.springboot;

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;


@RunWith(SpringRunner.class)
@WebMvcTest
public class HelloControllerTest {

	//스프링이 관리하는 빈(bean)을 주입받음
    @Autowired
    private MockMvc mvc;

    @Test
    public void hello가_리턴된다() throws Exception {
        String hello = "hello";
       //"/hello" 주소로 HTTP GET 요청
       mvc.perform(get("/hello"))
               .andExpect(status().isOk())
               .andExpect(content().string(hello));
    }
}

 

 

@RunWith(SpringRunner.class)

- 테스트를 진행할 때 JUnit에 내장된 실행자 외에 다른 실행자를 실행함.

- SpringRunner라는 스프링 실행자를 사용.

- 즉, 스프링 부트 테스트와 JUnit  사이에 연결자 역할을 함.

 

@WebMvcTest

- 어노테이션 중, Web(spring MVC)에 집중할 수 있는 어노테이션

- 선언시 Controller, @ControllerAdvice 등을 사용할 수 있음

- 단!!! @Service, @Component, @Repository등은 사용할 수 없음.

 

 private MockMvc mvc;

- 웹 API를 테스트 할때 사용

- 스프링 MVC 테스트의 시작점

- HTTP GET, POST등에 대한 API 테스트를 진행할 수 있음.

 

.andExpect(status().isOk())

- mvc.perform의 결과 검증

- HTTP Header의 Status를 검증

- 서버 상태를 검증 (200,404,500 등)

- 여기선 Ok =200인지 검증

 

 

.andExpect(content().string(hello));

- mvc.perform의 결과 검증

- 응답 본문의 내용 검증

- 리턴 값 검증

 

실행시키면 잘 오류 없이 빌드가 되는 걸 확인할 수 있다!

 

 

 

여기서 에러도 정리하고 가자!

 

에러 정리하기 >

1. import 에러

   - alt + enter로 import 하면 됨

 

STS에서 ctrl + enter로 import 해서 당연히 같을 줄 알았는데 아니었다.

 

2. 404 에러

 

에러 코드 >

 

@WebMvcTest 클래스는 컨트롤러를 사용할 수 있는 기능으로 별도로 작성 안 해도 된다.

 

 

 

 

마지막 단계로 커밋도 완료!!

 

Comments