[Spring boot] Spring ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•๊ณผ @SpringBootTest

๋ฐ˜์‘ํ˜•

์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•ด์•ผ ํ• ๊นŒ์š”?

 

์ œ๊ฐ€ ์ฒ˜์Œ ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๊ณ  ๋‚˜์„œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ–ˆ์„ ๋•Œ ๊ฐ€์žฅ ํฐ ์˜๋ฌธ์ ์ด ๋“ค์—ˆ๋˜ ์œ ํ˜•์ด์—ˆ์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ ๊ฐœ๋ฐœ๋กœ ์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ–ˆ์„ ๋•Œ๋Š” Unit Test์™€ Instrument Test ๋‘ ๊ฐ€์ง€๋ฅผ ์ง„ํ–‰ํ–ˆ๊ณ , ๊ฐ๊ฐ DB I/O ํ…Œ์ŠคํŠธ์™€ UI/UX ๋™์ž‘ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•œ ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋ฉด ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์–ด๋–จ๊นŒ์š”? ๋Œ€ํ‘œ์ ์ธ Spring boot๋ฅผ ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ ๋‹ค๋ค„๋ณผํ…๋ฐ, Spring boot์—์„œ๋Š” JUnit ์ด๋ผ๋Š” ํ…Œ์ŠคํŠธ ๋„๊ตฌ์™€ Mockito๋ผ๋Š” Mock ๊ฐ์ฒด ์ƒ์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๊ณ , ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ์„œ 3๊ฐ€์ง€๋กœ ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

Spring boot์˜ ํ…Œ์ŠคํŠธ ๋ถ„๋ฅ˜

https://spring.io/guides/gs/testing-web/

 

Testing the Web Layer

this guide is designed to get you productive as quickly as possible and using the latest Spring project releases and techniques as recommended by the Spring team

spring.io

๊ณต์‹ Spring์—์„œ ๊ฐ€์ด๋“œํ•˜๋Š” ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•์„ ๋ณด๋ฉด, Web Layer(Controller)๋งŒ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” @WebMvcTest์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด๋ฅผ ๋กœ๋“œํ•˜์—ฌ ์ง„ํ–‰ํ•˜๋Š” @SpringBootTest๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. 

 

  • WebMvcTest

    WebMvcTest๋Š” Controller(API) Layer๋งŒ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์ ํ•ฉํ•œ ํ…Œ์ŠคํŠธ ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ Controller๋งŒ์„ ๋กœ๋“œํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์•„์ฃผ ์ผ๋ชฉ์š”์—ฐํ•œ ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•

  • SpringBootTest

    SpringBootTest๋Š” ์‹ค์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž์‹ ์˜ ๋กœ์ปฌ ์œ„์— ์˜ฌ๋ ค์„œ ํฌํŠธ ์ฃผ์†Œ๊ฐ€ Listening ๋˜์–ด์ง€๊ณ , ์‹ค์ œ Database์™€ ์ปค๋„ฅ์…˜์ด ๋ถ™์–ด์ง€๋Š” ์ƒํƒœ์—์„œ ์ง„ํ–‰๋˜๋Š” Live ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•

์–ธ๋œป๋ณด๋ฉด ๋‘ ํ…Œ์ŠคํŠธ๊ฐ„์˜ ์ฐจ์ด๋Š” ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋„์šด๋‹ค๋Š” ์ ๊ณผ ์ผ๋ถ€ Controller๋งŒ์„ ๋„์šด๋‹ค๋Š” ์ ์œผ๋กœ ๋ณด์—ฌ์ง€๋Š”๋ฐ, ๋ชฉ์ ์œผ๋กœ๋งŒ ๋ณธ๋‹ค๋ฉด ์ด ์ ์ด ๊ฐ€์žฅ ํ•ต์‹ฌ์ด๋ฉฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ ํ…Œ์ŠคํŠธ ์‹œ๊ฐ„์ด ๊ทธ๋งŒํผ ๊ธธ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์‹ ๊ทœ ๊ธฐ๋Šฅ์ด๋‚˜ ๋ฒ„๊ทธ ํŒจ์น˜ ๋“ฑ ์ผ๋ถ€ ๊ธฐ๋Šฅ๋งŒ์„ ํ…Œ์ŠคํŠธํ•˜๊ณ ์ž ํ•  ๋–„๋Š” WebMvcTest๊ฐ€ ์ ๋‹นํ•˜๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด ์™ธ์—๋„ Data I/O๋งŒ์„ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•๋„ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

 

https://docs.spring.io/spring-boot/docs/1.4.2.RELEASE/reference/html/boot-features-testing.html

 

40. Testing

A few test utility classes are packaged as part of spring-boot that are generally useful when testing your application. TestRestTemplate is a convenience alternative to Spring’s RestTemplate that is useful in integration tests. You can get a vanilla temp

docs.spring.io

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ DB์˜ ์—ฐ๊ฒฐ์„ Spring Data JPA๋กœ ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด DataJpaTest๋Š” ์ด์— ์ ํ•ฉํ•œ ์„ ํƒ์ž…๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ง์ ‘์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ , Transaction ์ฝ”๋“œ์™€ EntityManager๋งŒ์„ ์ด์šฉํ•ด Database์˜ ํŠธ๋žœ์žญ์…˜์ด ์ž˜๋˜๋Š”์ง€๋ฅผ ๋ณด๊ธฐ ์œ„ํ•œ ์ „์šฉ ํ…Œ์ŠคํŠธ์ž…๋‹ˆ๋‹ค.

 

 

 

How to use

๋” ์ž์„ธํ•œ ์ด์•ผ๊ธฐ๋Š” ๋‹ค์Œ ํฌ์ŠคํŠธ์—์„œ ๋‹ค๋ค„๋ณผ ์˜ˆ์ •์ด์ง€๋งŒ ๊ฐ„๋‹จํžˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

testImplementation('org.springframework.boot:spring-boot-starter-test') {
    exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}

gradle์—์„œ Spring boot test ๋ชจ๋“ˆ์„ ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค.

 

๊ธฐ๋ณธ์ ์œผ๋กœ Spring boot์—์„œ ๋งŒ๋“ค์–ด์ฃผ๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ์œ„์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. @SpringBootTest๋Š” ์œ„์—์„œ ๋งํ–ˆ๋˜๋Œ€๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ง์ ‘ ๊ตฌ๋™ํ•ด์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๋ผ์ด๋ธŒ ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‚ฌ์šฉํ•  Controller(API)๋ฅผ ๋งŒ๋“  ๋‹ค์Œ ์ด๋ฅผ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์— ์˜์กด์„ฑ ์ฃผ์ž…ํ–ˆ์„ ๋•Œ ์ •์ƒ์ ์œผ๋กœ ๊ตฌ๋™๋˜๋Š”์ง€ ํ™•์ธํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

ํŽ˜์ด์ง€์— hello๋ฅผ ์ถœ๋ ฅํ•ด์ฃผ๋Š” HelloController๋ฅผ ํ•œ ๊ฐœ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฐ ๋‹ค์Œ HelloController๋ฅผ IoC์—์„œ ์ฃผ์ž…๋ฐ›๋Š” ํ˜•ํƒœ๋กœ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•œ ๋‹ค์Œ ์ด๊ฒƒ์ด ์ œ๋Œ€๋กœ ๋ฐ›์•„์ง€๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. (@SpringbootTest๊ฐ€ ์ •๋ง๋กœ ์ปจํ…์ŠคํŠธ๋ฅผ ์˜ฌ๋ ค์„œ ๋ชจ๋“  ๋นˆ์„ ๊ฐ€์ ธ์˜ค๋Š”์ง€๋ฅผ ๋ณด๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค.)

์‹คํ–‰ํ•ด๋ณด๋ฉด, ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ณ  ์žˆ์Œ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋” ๋‚˜์•„๊ฐ€์„œ PORT ์ฃผ์†Œ๋ฅผ 8080(๊ธฐ๋ณธ๊ฐ’)์ด ์•„๋‹Œ ๋ฌด์ž‘์œ„ํ•œ ํฌํŠธ ์ฃผ์†Œ๋กœ ์„ค์ •ํ•˜์—ฌ ํ…Œ์ŠคํŠธ ๋ฒ”์œ„๋ฅผ ๋„“ํ˜€๋ณผ ์ˆ˜ ์žˆ๊ณ , Controller์˜ ํ•จ์ˆ˜๊ฐ€ ์ž˜ ๋™์ž‘ํ•˜๋Š”์ง€๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

์ •๋ฆฌ

๊ฐ„๋‹จํ•˜๊ฒŒ @SpringBootTest๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์Šต๋‹ˆ๋‹ค. @SpringBootTest๋Š” ์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ Spring boot ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž์ฒด์˜ ์„ค์ •์„ ๋ฐ”๊ฟ”๊ฐ€๊ฑฐ๋‚˜ Properties๋ฅผ ์ž„์˜๋กœ ๋งŒ๋“œ๋Š” ๋“ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ „์—ญ ์„ค์ •์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์—ฌ๋Ÿฌ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด ๋†“์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

 

์ข…๋ฅ˜ ์š”์•ฝ Bean ๋ฒ”์œ„
@SpringBootTest ์ „์ฒด ํ…Œ์ŠคํŠธ ์–ด๋…ธํ…Œ์ด์…˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ฃผ์ž…๋œ Bean ์ „์ฒด
@WebMvcTest Controller Layer ํ…Œ์ŠคํŠธ MVC ๊ด€๋ จ Bean (Controller, Service)
@DataJpaTest Jpa (DB I/O) ํ…Œ์ŠคํŠธ JPA ๊ด€๋ จ Bean (EntityManager)
@RestClientTest Rest API ํ…Œ์ŠคํŠธ RestTemplate ๋“ฑ ์ผ๋ถ€ Bean
@JsonTest Json ๋ฐ์ดํ„ฐ ํ…Œ์ŠคํŠธ Json ๊ด€๋ จ ์ผ๋ถ€ Bean

 

๊ฐ„๋‹จํ•˜๊ฒŒ ๋†“๊ณ  ๋ณด๋ฉด, @SpringBootTest๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ „์ฒด Bean์„ ๋ชจ๋‘ ๊ฐ€์ ธ์˜ค๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์€ 4๊ฐœ์˜ ์–ด๋…ธํ…Œ์ด์…˜์€ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ์ผ๋ถ€ Bean์„ ์—”์ง€๋‹ˆ์–ด๊ฐ€ ์ง€์ •ํ•ด์„œ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด๋ผ๊ณ  ๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์–ด๋…ธํ…Œ์ด์…˜๋ณ„๋กœ ๊ทธ๋“ค๋งŒ์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ…œํ”Œ๋ฆฟ์„ ์ œ๊ณตํ•ด์คŒ์œผ๋กœ์จ ๋” ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด ์™ธ์—๋„ Spring WebFlux๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” WebFluxTest๊ฐ€ ๋ณ„๋„๋กœ ์กด์žฌํ•˜์ง€๋งŒ ์ด๋Š” ์ฐจํ›„ WebFlux๋ฅผ ๋‹ค๋ฃฌ ์ดํ›„์— ๋ณ„๋„๋กœ ๋‹ค๋ค„๋ณด๋Š” ๊ฒƒ์œผ๋กœ ์ง„ํ–‰ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 

๋งˆ์น˜๋ฉฐ...

๊ฐ„๋‹จํžˆ @SpringBootTest๊ฐ€ ์–ด๋–ค์‹์œผ๋กœ ์ง„ํ–‰๋˜๋Š”์ง€๋ฅผ ์•Œ์•„๋ดค์Šต๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด๋ฅผ ๋กœ๋“œํ•˜์—ฌ ์ „์ฒด์ ์ธ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ๋Š” ์˜๋ฏธ๊ฐ€ ์—†์ง€ ์•Š์„๊นŒ ๋ผ๋Š” ์ƒ๊ฐ์„ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ์ง€๋งŒ ๋‹จ์œ„๋ณ„๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•จ์œผ๋กœ์จ ํ…Œ์ŠคํŠธ ์‹œ๊ฐ„์„ ์ค„์ด๊ณ , ๋ถˆํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ œ์™ธ์‹œํ‚ด์œผ๋กœ์จ ๊ฐœ๋ฐœ ์‹œ๊ฐ„์„ ๋‹จ์ถ•์‹œํ‚ค๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค๊ณ  ๋ด…๋‹ˆ๋‹ค.

 

ํŠนํžˆ Spring ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๊ฐ„๋‹จํ•œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋ณด๋‹ค๋Š” ๋ชจ๋†€๋ฆฌ์Šค์˜ ์ปค๋‹ค๋ž€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋“ค๋„ ํฌํ•จ๋  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋งŒ์•ฝ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ์ „์ฒด ํ…Œ์ŠคํŠธ์ธ @SpringBootTest๋ฅผ ์ด์šฉํ•œ๋‹ค๋ฉด ๋ชจ๋“  Bean์ด ๋‹ค ๋กœ๋“œ๋˜๊ธฐ ๋•Œ๋ฌธ์— JVM์—์„œ ์ด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  Heap์— ํ• ๋‹นํ•˜๋Š” ๋ฐ๊นŒ์ง€ ๋งŽ์€ ์‹œ๊ฐ„์ด ์†Œ์š”๋˜๋ฏ€๋กœ ํ…Œ์ŠคํŠธ ๋น„์šฉ์„ ์ค„์ด๊ณ ์ž ํ•œ๋‹ค๋ฉด ์ด ๋ฐฉ๋ฒ•์„ ๊ถŒ์žฅ๋“œ๋ฆฌ์ง„ ์•Š์Šต๋‹ˆ๋‹ค.

 

๋‹ค์Œ ํฌ์ŠคํŠธ์—์„œ๋Š” @WebMvcTest๋กœ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•
TAGS.

Tistory Comments