Skip to content

Latest commit

ย 

History

History
103 lines (65 loc) ยท 3.76 KB

[Spring Boot] Test Code.md

File metadata and controls

103 lines (65 loc) ยท 3.76 KB

[Spring Boot] Test Code


ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ์ด์œ 

  • ๊ฐœ๋ฐœ๋‹จ๊ณ„ ์ดˆ๊ธฐ์— ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์Œ
  • ๋‚˜์ค‘์— ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜๊ฑฐ๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—…๊ทธ๋ ˆ์ด๋“œ ์‹œ ๊ธฐ์กด ๊ธฐ๋Šฅ์ด ์ž˜ ์ž‘๋™ํ•˜๋Š” ์ง€ ํ™•์ธ ๊ฐ€๋Šฅํ•จ
  • ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋ถˆํ™•์‹ค์„ฑ ๊ฐ์†Œ

๊ฐœ๋ฐœ ์ฝ”๋“œ ์ด์™ธ์— ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์ผ์€ ๊ฐœ๋ฐœ ์‹œ๊ฐ„์ด ๋Š˜์–ด๋‚  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‚ด ์ฝ”๋“œ์— ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ์ง€ ๊ฒ€์ฆํ•  ๋•Œ, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  ์ง„ํ–‰ํ•œ๋‹ค๋ฉด ๋” ์‹œ๊ฐ„ ์†Œ๋ชจ๊ฐ€ ํด ๊ฒƒ์ด๋‹ค.

1. ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ ๋’ค ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜์—ฌ ์„œ๋ฒ„๋ฅผ ํ‚จ๋‹ค.
2. API ํ”„๋กœ๊ทธ๋žจ(ex. Postman)์œผ๋กœ HTTP ์š”์ฒญ ํ›„ ๊ฒฐ๊ณผ๋ฅผ Print๋กœ ์ฐ์–ด์„œ ํ™•์ธํ•œ๋‹ค.
3. ๊ฒฐ๊ณผ๊ฐ€ ์˜ˆ์ƒ๊ณผ ๋‹ค๋ฅด๋ฉด, ๋‹ค์‹œ ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒํ•œ ๋’ค ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ๋ฐ˜๋ณตํ•œ๋‹ค.

์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์ด ์–ผ๋งˆ๋‚˜ ๋ฐ˜๋ณต๋  ์ง€ ๋ชจ๋ฅธ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ๋งˆ๋‹ค ์ €๋ ‡๊ฒŒ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๋ฉด ์„œ๋ฒ„๋ฅผ ํ‚ค๊ณ  ๋„๋Š” ์ž‘์—… ๋˜ํ•œ ๋„ˆ๋ฌด ๋น„ํšจ์œจ์ ์ด๋‹ค.

์ด ๋ฐ–์—๋„ Print๋กœ ๋ˆˆ์œผ๋กœ ๊ฒ€์ฆํ•˜๋Š” ๊ฒƒ๋„ ์–ด๋Š์ •๋„ ์„ ์—์„œ ํ•œ๊ณ„๊ฐ€ ์žˆ๋‹ค. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ์ž๋™์œผ๋กœ ๊ฒ€์ฆ์„ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๊ณตํ•œ๋‹ค๋ฉด ์ˆ˜๋™์œผ๋กœ ๊ฒ€์ฆํ•  ํ•„์š” ์ž์ฒด๊ฐ€ ์—†์–ด์ง„๋‹ค.

์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ์„ ๋•Œ๋„ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ๋งŒ์•ฝ ๊ธฐ์กด์˜ ์ฝ”๋“œ์— ์˜ํ–ฅ์ด ๊ฐ”๋‹ค๋ฉด ์–ด๋–ค ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ์ง€ ์•Œ ์ˆ˜ ์žˆ๋Š” ์žฅ์ ๋„ ์กด์žฌํ•œ๋‹ค.


๋”ฐ๋ผ์„œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐ ์žˆ์–ด์„œ ํ•„์ˆ˜์ ์ธ ๋ถ€๋ถ„์ด๋ฉฐ ๋ฐ˜๋“œ์‹œ ํ™œ์šฉํ•ด์•ผ ํ•œ๋‹ค.


ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์˜ˆ์ œ

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.result.MockMvcResultMatchers.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;

@RunWith(SpringRunner.class)
@WebMvcTest(controllers = HomeController.class)
public class HomeControllerTest {

    @Autowired
    private MockMvc mvc;

    @Test
    public void home_return() throws Exception {
        //when
        String home = "home";

        //then
        mvc.perform(get("/home"))
                .andExpect(status().isOk())
                .andExpect(content().string(home));
    }
}

  1. @RunWith(SpringRunner.class)

ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•  ๋•Œ JUnit์— ๋‚ด์žฅ๋œ ์‹คํ–‰์ž ์™ธ์— ๋‹ค๋ฅธ ์‹คํ–‰์ž๋ฅผ ์‹คํ–‰์‹œํ‚จ๋‹ค.

์Šคํ”„๋ง ๋ถ€ํŠธ ํ…Œ์ŠคํŠธ์™€ JUnit ์‚ฌ์ด์˜ ์—ฐ๊ฒฐ์ž ์—ญํ• ์„ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

  1. @WebMvcTest

์ปจํŠธ๋กค๋Ÿฌ๋งŒ ์‚ฌ์šฉํ•  ๋•Œ ์„ ์–ธ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, Spring MVC์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค.

  1. @Autowired

์Šคํ”„๋ง์ด ๊ด€๋ฆฌํ•˜๋Š” Bean์„ ์ฃผ์ž…์‹œ์ผœ์ค€๋‹ค.

  1. MockMvc

์›น API๋ฅผ ํ…Œ์ŠคํŠธํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด HTTP GET, POST, DELETE ๋“ฑ์— ๋Œ€ํ•œ API ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

  1. mvc.perform(get("/home"))

/home ์ฃผ์†Œ๋กœ HTTP GET ์š”์ฒญ์„ ํ•œ ์ƒํ™ฉ์ด๋‹ค.

  1. .andExpect(status().isOk())

๊ฒฐ๊ณผ๋ฅผ ๊ฒ€์ฆํ•˜๋Š” andExpect๋กœ, ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ๋ถ™์—ฌ์„œ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. status()๋Š” HTTP Header๋ฅผ ๊ฒ€์ฆํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ HTTP Status ์ƒํƒœ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ํ˜„์žฌ isOK()๋Š” 200 ์ฝ”๋“œ๊ฐ€ ๋งž๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์žˆ๋‹ค.


ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๋ฉด์„œ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ๋“ค์„ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ด์ฒ˜๋Ÿผ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋กœ ๊ฒฌ๊ณ ํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ๋ณ„ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ์Šต๊ด€์„ ๊ธธ๋Ÿฌ์•ผ ํ•œ๋‹ค.



[์ฐธ๊ณ  ์ž๋ฃŒ]