๐ Given-When-Then ํจํด
public void getAllMembers() throws Exception {
// given
final String url = "/test";
Member savedMember = memberRepository.save(new Member(1L, "ํ๊ธธ๋"));
// when
final ResultActions result = mockMvc.perform(get(url) // 1
.accept(MediaType.APPLICATION_JSON)); // 2
// then
result
.andExpect(status().isOk()); // 3
// 4
.andExpect(jsonPath("$[0].id").value(savedMember.getId()))
.andExpect(jsonPath("$[0].name").value(savedMember.getName()));
}
Given : ๋ฉค๋ฒ๋ฅผ ์ ์ฅ
When : ๋ฉค๋ฒ ๋ฆฌ์คํธ๋ฅผ ์กฐํํ๋ API ํธ์ถ
Then : ์๋ต ์ฝ๋๊ฐ 200 OK์ด๊ณ , ๋ฐํ๋ฐ์ ๊ฐ ์ค์ 0๋ฒ์งธ ์์์ id์ name์ด ์ ์ฅ๋ ๊ฐ๊ณผ ๊ฐ์์ง ํ์ธ
1. perform() : ์์ฒญ์ ์ ์กํ๋ ์ญํ ํ๋ ๋ฉ์๋
๊ฒฐ๊ณผ๋ก resultActions ๊ฐ์ฒด๋ฅผ ๋ฐ๊ณ ๋ฐํ๊ฐ์ ๊ฒ์ฆ, ํ์ธํ๋ andExpect()๋ฉ์๋๋ฅผ ์ ๊ณตํด์ค.
2. accept() : ์์ฒญ์ ๋ณด๋ผ ๋ ๋ฌด์จ ํ์ ์ผ๋ก ์๋ต์ ๋ฐ์์ง ๊ฒฐ์ ํ๋ ๋ฉ์๋
3. andExpect() : ์๋ต์ ๊ฒ์ฆ
OK(200)์ ๋ฐํํ๋ฏ๋ก ์ด์ ํด๋นํ๋ ๋ฉ์๋ isOk๋ฅผ ์ฌ์ฉํด ํ์ธํ๊ธฐ
4. jsonPath("$[0].${ํ๋๋ช }") : JSON ์๋ต๊ฐ์ ๊ฐ์ ๊ฐ์ ธ์ค๋ ์ญํ ํ๋ ๋ฉ์๋
0๋ฒ์งธ ๋ฐฐ์ด์ ๋ค์ด์๋ ๊ฐ์ฒด์ id, name๊ฐ ๊ฐ์ ธ์ค๊ณ ์ ์ฅ๋ ๊ฐ๊ณผ ๊ฐ์์ง ํ์ธ
| ์ฝ๋ | ๋งคํ ๋ฉ์๋ | ์ค๋ช |
| 200 OK | isOk() | HTTP์๋ต ์ฝ๋๊ฐ 200 OK์ธ์ง ๊ฒ์ฆ |
| 201 Created | isCreated() | ... 201 Created์ธ์ง ๊ฒ์ฆ |
| 400 Bad Request | isBadRequest() | ... 400 Bad Request์ธ์ง ๊ฒ์ฆ |
| 403 Forbidden | isForbidden() | ... 403 Forbidden์ธ์ง ๊ฒ์ฆ |
| 404 Not Found | isNotFound() | ... 404 Not Found์ธ์ง ๊ฒ์ฆ |
| 400๋ฒ๋ ์๋ต ์ฝ๋ | is4xxClientError() | ...400๋ฒ๋ ์๋ต ์ฝ๋์ธ์ง ๊ฒ์ฆ |
| 500 Internal Server Error | isinternalServerError() | ... 500 Internal Server Error์ธ์ง ๊ฒ์ฆ |
| 500๋ฒ๋ ์๋ต ์ฝ๋ | is5xxServererror() | ...500๋ฒ๋ ์๋ต ์ฝ๋์ธ์ง ๊ฒ์ฆ |
๐ ์คํ๋ง ๋ถํธ ์คํํฐ ํ ์คํธ ๋ชฉ๋ก
JUnit: ์๋ฐ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ฉ ๋จ์ ํ ์คํธ ํ๋ ์์ํฌ
- ํ ์คํธ ๋ฐฉ์์ ๊ตฌ๋ถํ ์ ์๋ ์ ๋ํ ์ด์ ์ ์ ๊ณต
- @Test ์ ๋ํ ์ด์ ์ผ๋ก ๋ฉ์๋๋ฅผ ํธ์ถํ ๋๋ง๋ค ์ ์ธ์คํด์ค๋ฅผ ์์ฑ, ๋ ๋ฆฝ ํ ์คํธ ๊ฐ๋ฅ
- ์์ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ฆํ๋ ์ด์ค์ ๋ฉ์๋ ์ ๊ณต
- ์ฌ์ฉ ๋ฐฉ๋ฒ์ด ๋จ์, ํ ์คํธ ์ฝ๋ ์์ฑ ์๊ฐ์ด ์ ์
- ์๋ ์คํ, ์์ฒด ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๊ณ ์ฆ๊ฐ์ ์ธ ํผ๋๋ฐฑ์ ์ ๊ณต
- @DisplayName : ํ ์คํธ ์ด๋ฆ์ ๋ช ์ํ๋ ์ ๋ํ ์ด์
- assertEquals(๊ธฐ๋ํ๋ ๊ฐ, ์ค์ ๋ก ๊ฒ์ฆํ ๊ฐ) : ๊ฒ์ฆ ๋ฉ์๋
Spring Test & Spring Boot Test : ์คํ๋ง ๋ถํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ํตํฉ ํ ์คํธ ์ง์
AssertJ : ๊ฒ์ฆ๋ฌธ์ธ ์ด์ค์ ์ ์์ฑํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- JUniot๊ณผ ํจ๊ป ์ฌ์ฉํด ๊ฒ์ฆ๋ฌธ์ ๊ฐ๋ ์ฑ์ ํ ๋์ฌ์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- Assertions.assertEquals(a + b, sum) -> assertThat(a + b).isEquals(sum) ๊ฐ๋ ์ฑ ๋์
- ์์ฃผ ์ฌ์ฉํ๋ ๋ฉ์๋
| ๋ฉ์๋ ์ด๋ฆ | ์ค๋ช |
| isEqualTo(A) | A๊ฐ๊ณผ ๊ฐ์์ง ๊ฒ์ฆ |
| isNotEqualTo(A) | A๊ฐ๊ณผ ๋ค๋ฅธ์ง ๊ฒ์ฆ |
| contains(A) | A ๊ฐ์ ํฌํจํ๋์ง ๊ฒ์ฆ |
| doesNotContain(A) | A ๊ฐ์ ํฌํจํ์ง ์๋์ง ๊ฒ์ฆ |
| startsWith(A) | ์ ๋์ฌ๊ฐ A์ธ์ง ๊ฒ์ฆ |
| endsWith(A) | ์ ๋ฏธ์ฌ๊ฐ A์ธ์ง ๊ฒ์ฆ |
| isEmpty() | ๋น์ด์๋ ๊ฐ์ธ์ง ๊ฒ์ฆ |
| isNotEmpty() | ๋น์ด์์ง ์์ ๊ฐ์ธ์ง ๊ฒ์ฆ |
| isPositive() | ์์์ธ์ง ๊ฒ์ฆ |
| isNegative() | ์์์ธ์ง ๊ฒ์ฆ |
| isGreaterThan(1) | 1๋ณด๋ค ํฐ ๊ฐ์ธ์ง ๊ฒ์ฆ |
| isLessThan(1) | 1๋ณด๋ค ์์ ๊ฐ์ธ์ง ๊ฒ์ฆ |
Hamcrest : ํํ์์ ๋ณด๋ค ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋ง๋๋ ๋ฐ ์ฌ์ฉ๋๋ Matcher ๋ผ์ด๋ธ๋ฌ๋ฆฌ
Mockito : ํ ์คํธ์ ์ฌ์ฉํ ๊ฐ์ง ๊ฐ์ฒด์ธ ๋ชฉ ๊ฐ์ฒด๋ฅผ ์ฝ๊ฒ ๋ง๋ค๊ณ , ๊ด๋ฆฌํ๊ณ , ๊ฒ์ฆํ ์ ์๊ฒ ์ง์ํ๋ ํ ์คํธ ํ๋ ์์ํฌ
JSONassert : JSON์ฉ ์ด์ค์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
JsonPath : JSON ๋ฐ์ดํฐ์์ ํน์ ๋ฐ์ดํฐ๋ฅผ ์ ํํ๊ณ ๊ฒ์ํ๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
๐ ์ ๋ํ ์ด์ ์ ๋ฐ๋ฅธ ์คํ ์์
1) @BeforeAll : ์ ์ฒด ํ ์คํธ๋ฅผ ์์ํ๊ธฐ ์ ์ฒ์ ํ ๋ฒ ์คํ
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฐ๊ฒฐํด์ผ ํ๊ฑฐ๋ ํ ์คํธ ํ๊ฒฝ์ ์ด๊ธฐํํ ๋์ ๊ฐ์ด ์ฌ์ฉ๋จ
ํ ๋ฒ๋ง ํธ์ถ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ฉ์๋๋ฅผ static์ผ๋ก ์ ์ธ
2) @BeforeEach : ํ ์คํธ ์ผ์ด์ค๋ฅผ ์์ํ๊ธฐ ์ ๋งค๋ฒ ์คํ
๊ฐ์ฒด๋ฅผ ์ด๊ธฐํํ๊ฑฐ๋ ํ ์คํธ์ ํ์ํ ๊ฐ์ ๋ฏธ๋ฆฌ ๋ฃ์ ๋์ ๊ฐ์ด ์ฌ์ฉ๋จ.
๊ฐ ์ธ์คํด์ค์ ๋ํด ๋ฉ์๋๋ฅผ ํธ์ถํด์ผ ํ๋ฏ๋ก static์ผ๋ก ์ ์ธํ์ง ์์ต๋๋ค.
3) @AfterEach : ํ ์คํธ ์ผ์ด์ค๋ฅผ ์ข ๋ฃํ๊ธฐ ์ ๋งค๋ฒ ์คํ
ํน์ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํด์ผ ํ ๋์ ๊ฐ์ด ์ฌ์ฉ๋จ.
๊ฐ ์ธ์คํด์ค์ ๋ํด ๋ฉ์๋๋ฅผ ํธ์ถํด์ผ ํ๋ฏ๋ก static์ผ๋ก ์ ์ธํ์ง ์์ต๋๋ค.
4) @AfterAll : ์ ์ฒด ํ ์คํธ ๋ง์น ํ ์ข ๋ฃํ๊ธฐ ์ ํ ๋ฒ ์คํ
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ์ข ๋ฃํ๊ฑฐ๋ ๊ณตํต์ ์ผ๋ก ์ฌ์ฉํ๋ ์์์ ํด์ ํ ๋์ ๊ฐ์ด ์ฌ์ฉ๋จ.
ํ ๋ฒ๋ง ํธ์ถ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ฉ์๋๋ฅผ static์ผ๋ก ์ ์ธ
๐ํ ์คํธ ์ฝ๋ ์ ๋ํ ์ด์ ์ ๋ฆฌ
@DisplayName : ํ ์คํธ ์ด๋ฆ ๋ช ์
@Test : ์ด๋ฅผ ๋ถ์ธ ๋ฉ์๋๋ ํ ์คํธ๋ฅผ ์ํํ๋ ๋ฉ์๋๊ฐ ๋ฉ๋๋ค.
@SpringBootTest : ๋ฉ์ธ ์ ํ๋ฆฌ์ผ์ด์ ํด๋์ค์ ์ถ๊ฐํ๋ ์ ๋ํ ์ด์ ์ธ @SpringBootApplication์ด ์๋ ํด๋์ค๋ฅด ์ฐพ๊ณ ๊ทธ ํด๋์ค์ ํฌํจ๋์ด ์๋ ๋น์ ์ฐพ์ ๋ค์ ํ ์คํธ์ฉ ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ๋ผ๋ ๊ฒ์ ๋ง๋ญ๋๋ค.
@AutoConfigureMockMvc : MockMvc๋ฅผ ์์ฑํ๊ณ ์๋์ผ๋ก ๊ตฌ์ฑ
MockMvc : ์ดํ๋ฆฌ์ผ์ด์ ์ ์๋ฒ์ ๋ฐฐํฌํ์ง ์๊ณ ๋ ํ ์คํธ์ฉ MVCํ๊ฒฝ์ ๋ง๋ค์ด ์์ฒญ ๋ฐ ์ ์ก, ์๋ต ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์ ํธ๋ฆฌํฐ ํด๋์ค. ์ฆ, ์ปจํธ๋กค๋ฌ๋ฅผ ํ ์คํธํ ๋ ์ฌ์ฉ๋๋ ํด๋์ค.
@BeforeEach : ํ ์คํธ๋ฅผ ์คํํ๊ธฐ ์ ์คํํ๋ ๋ฉ์๋์ ์ ์ฉ
@AfterEach : ํ ์คํธ๋ฅผ ์คํํ ์ดํ์ ์คํํ๋ ๋ฉ์๋์ ์ ์ฉ
