본문 바로가기
OpenSource/Spring Boot

springbootStudy05- test code를 작성해보자

by 태하팍 2021. 10. 27.
반응형
  • 이 강좌는 매주 화요일 사외 스터디를 통해 작성!
  • 스프링 부트와 AWS로 혼자 구현하는 웹서비스 책을 선정!(이동욱 저)
    • 내가 생각하는 커리큘럼이랑 같아서 선정! 

 

지난 스터디

2021.10.13 - [OpenSource/Spring Boot] - springbootStudy01 - Jetbrains toolbox 설치

2021.10.14 - [OpenSource/Spring Boot] - springbootStudy02 - 그래들 기반 springboot project만들기! build.gradle 이해하기

2021.10.19 - [OpenSource/Spring Boot] - springbootStudy03-인텔리J(IntelliJ)에서 깃헙(github)연동 해보기

2021.10.26 - [OpenSource/Spring Boot] - springbootStudy04 - .gitignore 파일을 만들어보자

test code..! 책에서는 controller를 테스트하는것이 나온다.
그런데 보통은 service단 로직을 테스트하는 경우가 많다. 컨트롤러를 테스트 코드를 작성한 적은 거의 없던거 같다ㅋㅋ;
아마도 이해하기 쉽게 설명하기 위해 로직단까지 들어가지 않고 컨트롤러쪽 테스트부터 들어간것 같다.

들어가기 전에 MVC패턴을 살짝쿵 보고 들어갑시다!

https://acet.pe.kr/186

 

[Ace-T의 Spring강좌] Step 04. Spring @MVC 분석-01

[Ace-T의 Spring강좌]   Step 04. Spring @MVC 만들기>> << 목표 환경 >> 1) Eclipse(done) 2) PostgreSQL 3) Apache Tomcat or JBoss 4) JUnit(done) 5) SpringFramework(done) 6) JDK 6.0(done) 2013/11/..

acet.pe.kr

테스트 코드를 짜기 위해 필요한 것
패키지 설정 및 소스 추가
소스 : 메인 클래스, 컨트롤러소스, 테스트코드 소스

이제 코드를 짜보도록 하겠습니다.

패키지 설정

1. main과 test쪽에 동일하게 만들어 줍니다.

kr.pe.acet처럼 도메인을 거꾸로 보통 해줍니다. 관습일려나?..

kr.pe.acet 패키지에 Application(메인함수)를 만들어 줍니다.

package kr.pe.acet;

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);
    }
}


최종적으로는 아래와 같은 형태가 됩니다.

다음으로 컨트롤러 소스를 위해 패키지 controller를 추가하고 소스를 추가 합니다.

우선 메인쪽 컨트롤러를 우선 만들어보겠습니다.

그리고 아래와 같이 코딩 합니다.

package kr.pe.acet.controller;

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!";
    }
}

이제 테스트 코드를 짜보겠습니다.
테스트코드는 뒤에 Test를 붙여서 클래스를 생성 합니다. 패키지는 메인쪽과 동일합니다.

책에 있는 코드를 그대로 사용하면 아래와 같이 오류가 납니다. Why??
우리는 그대로 보고 코드를 작성하고 돌려보는게 목적이 아닌 테스트 코드를 작성 하는 것입니다.
이런 오류가 났을 땐 동작을 하기 위해 원인을 찾아보는것 또한 현업에서 하는 일 입니다.
즐겁게 해결 해봅시다~

 

알고보니 @RunWith(SpringRunner.class) 코드는 스프링부트 최신판에서는 볼수가 없다고 합니다.
왜냐하면 Junit4에서 5로 버전업을 하면서 Junit5에서는 사용하지 않으며 대신에 아래와 같이
@ExtendWith(SpringExtension.class)를 사용 합니다. 요녀석은 생략이 가능 합니다.

다음으로 get은 import가 뜨지 않아서 수동으로 import구문을 작성하여 줍니다.

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;

이제 모든 빨간 오류가 사라졌습니다. 아래와 같은 최종 소스가 작성 되었습니다.

package kr.pe.acet.controller;


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.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.servlet.MockMvc;

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

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

    @Autowired private MockMvc mvc;

    @Test
    public void hello가_리턴된다() throws Exception {
        String hello = "hello";
        mvc.perform(get("/hello"))
                .andExpect(status().isOk())
                .andExpect(content().string(hello));

    }

}

이제 테스크 코드를 동작 시켜보겠습니다.
좌측에 녹색 버튼을 누르면 아래와 같이 선택사항이 있습니다.
참고로 벌레모양은 디버깅 모드 입니다.

으악! 오류가 났습니다. 책의 소스를 100퍼 따라하지 않아서였네요
다시 오류 로그를 보니 리턴을 hello가 아닌 hello!를 해주고 있었네요

테스트코드에서 String hello = "hello!"이렇게 수정하고 다시 돌려보겠습니다.

테스트 성공!

commit 후에 github에 push!

점점 재밌어지네요 ㅎㅎ 3장부터 개발 시작이네요!
화이팅!

  끝.

반응형