-
[์ฐจ๊ทผ์ฐจ๊ทผ ๊ธฐ์ด ๋ค์ง๊ธฐ] 02. BackEnd: Test - JUnit 5๐ณDev/์ฐจ๊ทผ์ฐจ๊ทผ ๊ธฐ์ด ๋ค์ง๊ธฐ 2021. 12. 27. 15:04
๐ณJUnit
JUnit์ Java์ ๋จ์ ํ ์คํธ ํ๋ ์์ํฌ ๋๊ตฌ์ด๋ค. ์ฆ, ๋ด ์ฝ๋๊ฐ ๋ด ์๋๋๋ก ์ ๋์ํ๋ ์ง ๊ฒ์ฆํ ์ ์๋ ๋๊ตฌ์ด๋ค. Annotation์ผ๋ก ๊ฐ๊ฒฐํ๊ฒ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ฉฐ, ๋จ์ ๋ฌธ(assert)์ ์ฌ์ฉํ์ฌ ํ ์คํธ ๊ฒฐ๊ณผ๋ฅผ ํ๋ณํ๋ค๋ ํน์ง์ด ์๋ค.
์คํ๋ง ์ด๋์ ๋ผ์ด์ฆ๋ก ์์ฑ๋ ํ๋ก์ ํธ๋ build.gradle ํ์ผ์ spring-boot-starter-test๊ฐ ๋ํ๋์์ ์ถ๊ฐ๋์ด ๋ด์ฅ๋ JUnit์ ํฌํจํ ๋ค์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์ฌ์ฉํ ์ ์๋ค.(SpringTest, Spring Boot Test, AssertJ, Hamcrest, Mockito, JSONassert, JsonPath)
์๋ฌด๊ฒ๋ ์ค์ ํ์ง ์์ ์คํ๋ง ํ๋ก์ ํธ๋ฅผ ์คํํ๋ฉด, ๋ค์๊ณผ ๊ฐ์ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋ณผ ์ ์๋ค. main๊ณผ test์ ๊ฐ์ ๊ตฌ์กฐ์ ๋๋ ํ ๋ฆฌ๋ฅผ ํ์ธํ ์ ์๋ค. test ๋๋ ํ ๋ฆฌ์์ testing์ ์งํํ ์ ์๋ค. test ๋๋ ํ ๋ฆฌ๊ฐ ์์ผ๋ฉด ์์ฑํด์ฃผ๋ฉด ๋๋ค.
UnitTest By Martin Fowler
์ ๋ ํ ์คํธ(Unit Test)๋ XP(Extreme Programming, ์ด๊ธฐ ์์์ผ)์ ํน์ง์ ์ธ ํ๋์ด๋ฉฐ, ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ์ ๋น ๋ฅด๊ฒ ์ด๋์๋ค. ์ ๋ ํ ์คํธ๋ ์ธ๊ฐ์ง ํน์ง์ด ์๋ค. ๋จผ์ ์ ๋ํ ์คํธ๋ ์ํํธ์จ์ด ์์คํ ์ ์์ ๋ถ๋ถ์ ์ง์คํ๋ค. ๊ทธ๋ฆฌ๊ณ ํ ์คํธ ํด์ ์ฌ์ฉํ์ฌ ํ๋ก๊ทธ๋๋จธ๋ค์ด ์ง์ ์์ฑํ๋ฉฐ, ๋ค๋ฅธ ํ ์คํธ ๋ฐฉ์๋ณด๋ค ๋น ๋ฅด๊ธฐ๋ฅผ ๊ธฐ๋ํ๋ค.
์ ๋ํ ์คํธ๋ ํด๋์ ์คํ์ผ๊ณผ Mock์คํ์ผ๋ก ๋ฐ์ ๋์๋ค. ํด๋์์ ํ๋ ์ ๋ํ ์คํธ๋ฅผ ์ถ๊ตฌํ๊ณ , Mock์ ๋จ๋ ์ ๋ํ ์คํธ๋ฅผ ๊ณ ์งํ๋ค.
MockMVC
MockMVC๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ฒ์ ๋ฐฐํฌํ์ง ์๊ณ ๋ ์คํ๋ง MVC ๋์์ ์ฌํํ ์ ์๋ Spring-test ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํด๋์ค์ด๋ค.
๐Testing ์์ํ๊ธฐ
๋จผ์ AbstractTest ํ์ผ์ ๋ง๋ค์ด์ ํ ์คํธ ์ค์ ์ ํด์ฃผ๊ณ , ์ด๋ฅผ ์์๋ฐ์ ํ ์คํธํ๋ ๋ฐฉ์์ ์ทจํ๋ค. WebApplicationContext๋ MockMVC ๊ฐ์ฒด ์์ฑ์ ์ํด ๋ง๋ค์ด์ฃผ๊ณ , setup ๋ฉ์๋์์ mvc๋ฅผ build ํด์ค๋ค.
@BeforeEach๋ JUnit5์ Annotation์ผ๋ก ํด๋น ๋ฉ์๋๊ฐ ๊ฐ ํ ์คํธ ๋ฉ์๋ ์ ์ ์คํ๋๋๋ก ํ๋ค. JUnit5 ์ด์ ์๋ Before์ด๋ผ๋ ์ด๋ฆ์ผ๋ก ์ฐ์๋ค.
์ด์ ํ ์คํธ๋ฅผ ์ํ DempApplicationTests์ ์์ฑํ๋ค. ์ด ํด๋์ค๋ AbstractTest ํด๋์ค๋ฅผ ์์๋ฐ๊ณ ์์ผ๋ฉฐ, ํ๋์ ํ ์คํธ ์์๋ @Test์ด ๋ถ์ด์๋ค. ์๋ this.mockMvc์ ๊ตฌ์ฑ์ ๋ณด์.
.perform
์ ํตํด ์์ฒญ์ ์ ์กํ๊ณ ResultActions ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. ๊ทธ๋ฆฌ๊ณ ํด๋น ๋ฐํ๊ฐ์andExpect
๋ก ๊ฒ์ฆํ ์ ์๋ค. ๊ฒ์ฆ ๋์์ผ๋ก๋ ์ํ ์ฝ๋, ๋ทฐ ์ด๋ฆ, ๋ฆฌํ์ด๋ ํธ ์๋ต, ๋ชจ๋ธ ์ ๋ณด, ์๋ต ์ ๋ณด ๋ฑ์ ํตํด์ ์๋ํ ๊ฐ๊ณผ ๊ฐ์์ง ํ์ธํ ์ ์๋ค.์์ ์ด๋ฏธ์ง์์ ์ฐ๋ฆฌ๋ ์๋ก์ด Post๋ฅผ ์์ฑํ๋ ํ ์คํธ๋ฅผ ์งํํ๊ณ ์ ํ๋ค. ์ด๋ฅผ ์ํด ์๋ก์ด ๊ฐ์ ๋ฃ์ด์ฃผ์ด์ผ ํ๋ฏ๋ก, PostRequest์ ๊ฐ์ฒด๋ฅผ ํตํด์ Post์ title๊ณผ content์ ๊ฐ์ ์ค์ ํ๊ณ ์ด๋ฅผ mockMvc์ ๋ณด๋ด์ด ํ ์คํธํ๊ณ ์ ํ๋ค. ์ด๋ ๊ฐ์ฒด์ธ PostRequest๋ฅผ JSONํ์ผ๋ก ๋ณํํด ์ฃผ๋ ์ผ์ JacksonUtil ํ์ผ์์ ์ฒ๋ฆฌํ๋ค.
Test๋ฅผ ์คํํ๊ณ ์ฌ๋ฐ๋ฅธ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋ฉด, ์๋์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค.
Application Context
Application Context๋ ์คํ๋ง์ด ๊ด๋ฆฌํ๋ Bean๋ค์ด ๋ด๊ฒจ์๋ ์ปจํ ์ด๋๋ฅผ ์๋ฏธํ๋ค. ์คํ๋ง ์ดํ๋ฆฌ์ผ์ด์ ์์ application context๋ ์๋ ๋๊ฐ๋ก ๋๋๋ค. (์์ธํ ๊ฒ์ ๋์ค์ ๋ ์์๋ณด์)
- ContextLoaderListener์ ์ํด์ ๋ง๋ค์ด์ง๋ Root WebApplicationContext
- DispatcherServlet์ ์ํด์ ๋ง๋ค์ด์ง๋ WebApplicationContext
Jackson
Jackson์ ์คํ๋ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ฉฐ, XML๊ณผ JSON ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณํํด์ค๋ค. ๋น์ทํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก๋ GSON๊ณผ SimpleJSON์ด ์๋ค. ํ์ง๋ง Spring 3.1์ดํ๋ก Jackson์ ํตํด ๊ฐ์ฒด๋ง ๋ฐํํด๋ JSON ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๋ค.
Reference
https://medium.com/@joohotheman/%EB%B2%88%EC%97%AD-unittest-by-martin-fowler-2fbba01a782e
https://unordinarydays.tistory.com/131
https://galid1.tistory.com/476
https://mommoo.tistory.com/83
https://shinsunyoung.tistory.com/52'๐ณDev > ์ฐจ๊ทผ์ฐจ๊ทผ ๊ธฐ์ด ๋ค์ง๊ธฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ฐจ๊ทผ์ฐจ๊ทผ ๊ธฐ์ด ๋ค์ง๊ธฐ] 04 BackEnd: H2 & Exception (0) 2021.12.30 [์ฐจ๊ทผ์ฐจ๊ทผ ๊ธฐ์ด ๋ค์ง๊ธฐ] 03. FrontEnd: React & Axios (0) 2021.12.28 [์ฐจ๊ทผ์ฐจ๊ทผ ๊ธฐ์ด ๋ค์ง๊ธฐ] 01. BackEnd: Server - Spring (0) 2021.11.27