
ํ ์คํธ ์ฝ๋๋?
ํ ์คํธ ์ฝ๋๋ ์์ฑํ ์ฝ๋๊ฐ ์๋๋๋ก ์ ์๋ํ๋์ง ํ์ธํ๋ ์ฝ๋์ด๋ค.
ํ ์คํธ ์ฝ๋๋ test ๋๋ ํฐ๋ฆฌ์์ ์์ ํ๋ค. ํ ์คํธ ์ฝ๋ ํจํด์ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋๋ฐ ๋ณดํธ์ ์ผ๋ก ์ฌ์ฉ๋๋ ํจํด์
"given-when-then" ํจํด์ด๋ค.
@DisplayName("Save New Pet")
@Test
public void savePetTest(){
// given : ๋ฐ๋ ค๋๋ฌผ์ ์ ์ฅํ๊ธฐ ์ํ ์ค๋น ๊ณผ์
final String name = "BlackCherry";
final int age = 4;
final Pet pet = new Pet(name, age);
// when : ์ค์ ๋ก ์ ์ฅ
final long saveId = petService.save(pet)
// then : ์ถ๊ฐ๊ฐ ์ ๋์๋์ง ํ์ธ
final Pet savePet = petService.findById(saveId).get();
assertThat(savePet.getName()).isEqualTo(name);
assertThat(savePet.getAge()).isEqualTo(age);
}
์คํ๋ง ๋ถํธ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ ์คํธํ๊ธฐ ์ํ ๋๊ตฌ์ ์ ๋ํ ์ด์ ์คํํฐ์ธ spring-boot-starter-test๋ฅผ ์ ๊ณตํ๋ค.
โ JUnit : ์๋ฐ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ฉ ๋จ์ ํ ์คํธ ํ๋ ์์ํฌ
Spring Test & Spring Boot Test : ์คํ๋ง ๋ถํธ ์ ํ๋ฆฌ์ผ์ด์ ํตํฉ ํ ์คํธ ์ ๊ณต
โ AssertJ : ๊ฒ์ฆ๋ฌธ์ธ Assertion์ ์์ฑํ๋๋ฐ ์ฌ์ฉ
Hamcrest : ํํ์์ ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋ง๋๋ ๋ฐ ์ฌ์ฉ๋๋ Matcher ๋ผ์ด๋ธ๋ฌ๋ฆฌ
Mockito : ํ ์คํธ์ ์ฌ์ฉํ ๊ฐ์ง ๊ฐ์ฒด์ธ Mock์ ์ฝ๊ฒ ๋ง๋ค๊ณผ ๊ด๋ฆฌํ๋ฉฐ, ๊ฒ์ฆํ ์ ์๊ฒ ์ง์ํ๋ ํ๋ ์์ํฌ
JSONassert : JSON์ฉ Assertion Library
JSONPath : JSON ๋ฐ์ดํฐ์์ ํน์ ๋ฐ์ดํฐ๋ฅผ ์ ํํ๊ณ ๊ฒ์ํ๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
JUnit
JUnit์ ์๋ฐ ์ธ์ด๋ฅผ ์ํ ๋จ์ ํ ์คํธ ํ๋ ์์ํฌ์ด๋ค.
JUnit์ ํน์ง
- ํ ์คํธ ๋ฐฉ์์ ๊ตฌ๋ถํ ์ ์๋ ์ ๋ํ ์ด์ ์ ๊ณต
- @Test ์ ๋ํ ์ด์ ์ผ๋ก ๋ฉ์๋ ํธ์ถ์๋ง๋ค ์ ์ธ์คํด์ค ์์ฑ. ๋ ๋ฆฝ ํ ์คํธ ๊ฐ๋ฅ
- ์์ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ฆํ๋ ์ด์ ์ ๋ฉ์๋ ์ ๊ณต'
- ์ฌ์ฉ๋ฐฉ๋ฒ์ด ๋จ์ํ๊ณ , ํ ์คํธ ์ฝ๋ ์์ฑ ์๊ฐ์ด ์ ์
- ์๋ ์คํ, ์์ฒด ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๊ณ ์ฆ๊ฐ์ ํผ๋๋ฐฑ ์ ๊ณต
public class JUnitTest{
@Display("1+2=3?") // ํ
์คํธ ์ด๋ฆ
@Test // ํ
์คํธ ๋ฉ์๋
public void junitTest(){
int a = 1;
int b = 2;
int sum = 3;
Assertions.assertEquals(sum, a+b); // ๊ฐ์ด ๊ฐ์์ง ํ์ธ
}
@Display("1+2=4?")
@Test
public void junitFailedTest(){
int a = 1;
int b = 2;
int sum = 4;
Assertions.assertEquals(sum, a+b);
}
}
@DisplayName ์ ๋ํ ์ด์ ์ ํ ์คํธ ์ด๋ฆ์ ๋ช ์ํด์ค๋ค.
@Test ์ ๋ํ ์ด์ ์ ๋ถ์ธ ๋ฉ์๋๋ ํ ์คํธ๋ฅผ ์ํ ๋ฉ์๋๊ฐ ๋๋ค. ํ ์คํธ ๋ผ๋ฆฌ ์ํฅ์ ์ฃผ์ง ์๋๋ก ๊ฐ ํ ์คํธ๋ฅผ ์คํํ ๋๋ง๋ค ํ ์คํธ๋ฅผ ์ํ ์คํ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ํ ์คํธ๊ฐ ์ข ๋ฃ๋๋ฉด ์คํ ๊ฐ์ฒด๋ ์ญ์ ๋๋ค.
JUnit์์ ์ ๊ณตํ๋ ๊ฒ์ฆ ๋ฉ์๋์ธ assertEquals๋ ์ธ์๋ก ๋ฐ์ ๋ ์ธ์๊ฐ ๊ฐ์์ง๋ฅผ ํ์ธํด ์ค๋ค.
ํ ์คํธ๋ ์ ๋ํ ์ด์ ์ ๋ฐ๋ผ ์คํ ์์๊ฐ ์ ํด์ง๋ค.
import org.junit.jupiter.api*;
public class JUnitCycleTest{
@BeforeAll // ์ ์ฒด ํ
์คํธ ์คํ ์ 1ํ ์คํํ๋ฏ๋ก static์ผ๋ก ์ ์ธ
static void beforeAll(){
System.out.println("@BeforeAll");
}
@BeforeEach // ํ
์คํธ ์ผ์ด์ค ์์ํ๊ธฐ ์ ๋ง๋ค ์คํ
public void beforEach(){
System.out.println("@BeforeEach");
}
@Test
public void test1(){
System.out.println("test1");
}
@Test
public void test1(){
System.out.println("test1");
}
@AfterAll // ์ ์ฒด ํ
์คํธ๋ฅผ ๋ง์น๊ณ ์ข
๋ฃ์ 1ํ ์คํํ๋ฏ๋ก static์ผ๋ก ์ ์ธ
static void afterAll(){
System.out.println("@AfterAll");
}
@AfterEach // ํ
์คํธ ์ผ์ด์ค ์ข
๋ฃ ์ ๋ง๋ค ์คํ
public void afterEach(){
System.out.println("@AfterEach");
}
}
@BeforeAll
์ ์ฒด ํ ์คํธ๋ฅผ ์คํํ๊ธฐ์ ์ ์ต์ด 1ํ ์คํํ๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฐ๊ฒฐํ๊ฑฐ๋ ํ ์คํธ ํ๊ฒฝ์ ์ด๊ธฐํํ ๋ ์ฌ์ฉํ๋ค.
์ ์ฒด ํ ์คํธ ์คํ ์ฃผ๊ธฐ์์ ํ ๋ฒ๋ง ํธ์ถ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ฉ์๋๋ฅผ static์ผ๋ก ์ ์ธํ๋ค.
@BeforeEach
ํ ์คํธ ์ผ์ด์ค๋ฅผ ์คํํ๊ธฐ ์ ๋ง๋ค ์คํ๋๋ค. ํ ์คํธ์ ์ฌ์ฉ๋๋ ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํํ๊ฑฐ๋, ํ ์คํธ์ ํ์ํ ๊ฐ์ ๋ฏธ๋ฆฌ ๋ฃ์ ์ ์๋ค.
@AfterAll
์ ์ฒด ํ ์คํธ๋ฅผ ๋ง์น๊ณ ์ข ๋ฃํ๊ธฐ์ ์ ์คํ๋จ.
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ข ๋ฃํ๊ฑฐ๋ ๊ณตํต์ ์ผ๋ก ์ฌ์ฉํ๋ ์์์ ํด์ ํ ๋ ์ฌ์ฉ๊ฐ๋ฅํ๋ค.
@AfterEach
๊ฐ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์ข ๋ฃํ๊ธฐ ์ ๋งค๋ฒ ์คํ๋๋ค. ํ ์คํธ ์ดํ ํน์ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ค.

AssertJ
AssetJ๋ JUnit๊ณผ ํจ๊ป ์ฌ์ฉํด ๊ฒ์ฆ๋ฌธ์ ๊ฐ๋ ์ฑ์ ๋์ฌ์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
assertThat(a+b).isEqualTo(sum);
AssertJ์๋ ๋ค์ํ ๋ฉ์๋๋ค์ด ์กด์ฌํ๋ค.
| ๋ฉ์๋ ์ด๋ฆ | ์ค๋ช |
| isEqualTo(A) | A ๊ฐ๊ณผ ๊ฐ์์ง ๊ฒ์ฆ |
| isNotEqualTo(A) | A๊ฐ๊ณผ ๋ค๋ฅธ์ง ๊ฒ์ฆ |
| contains(A) | A๊ฐ์ ํฌํจํ๋์ง ๊ฒ์ฆ |
| doesNotContains(A) | A๊ฐ์ ํฌํจํ์ง ์๋์ง ๊ฒ์ฆ |
| startsWith(A) | ์ ๋์ฌ๊ฐ A์ธ์ง ๊ฒ์ฆ |
| endsWith(A) | ์ ๋ฏธ์ฌ๊ฐ A์ธ์ง ๊ฒ์ฆ |
| isEmpty() | ๋น์ด์๋ ๊ฐ์ธ์ง ๊ฒ์ฆ |
| isNotEmpty | ๋น์ด์์ง ์์ ๊ฐ์ธ์ง ๊ฒ์ฆ |
| isPositive() | ์์์ธ์ง ๊ฒ์ฆ |
| isNegative() | ์์์ธ์ง ๊ฒ์ฆ |
| isGreaterThan(1) | 1๋ณด๋ค ํฐ ๊ฐ์ธ์ง ๊ฒ์ฆ |
| isLessThen(1) | 1๋ณด๋ค ์์ ๊ฐ์ธ์ง ๊ฒ์ฆ |
ํ ์คํธ ์ฝ๋ ์์ฑํ๊ธฐ
ํด๋์ค ์ด๋ฆ ์์ ๋ง์ฐ์ค ์ปค์๋ฅผ ๋๊ณ Alt+Enter๋ฅผ ๋๋ฅด๋ฉด ํ ์คํธ์ผ์ด์ค๋ฅผ ์์ฑํ๋ ์ฐฝ์ด ์๊ธด๋ค.
OK๋ฅผ ๋๋ฅด๊ฒ ๋๋ฉด `ํด๋์ค์ด๋ฆTest.java` ํ์ผ์ด test/java/ํจํค์ง ์๋์ ์์ฑ๋๋ค.
@SpringBootTest // ํ
์คํธ์ฉ ์ ํ๋ฆฌ์ผ์ด์
์ปจํ
์คํธ
@AutoConfigurationMocMvc // MockMVC ์์ฑ ๋ฐ ์๋ ๊ตฌํ
class TestControllerTest{
@Autowired
protected MockMvc mockMvc;
@Autowired
private WebApplicationContext context;
@Autowired
private PetRepository petRepository;
@BeforeEach
public void mockMvcSetUp(){
this.mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
}
@AfterEach
public void cleanUp(){
petRepository.deleteAll();
}
@DisplayName("getAllPets test")
@Test
public void getAllPets() throws Exception{
// given
final String url = "/test";
Pet savedPet = petRepository.save(new Pet(1l, "Rose"));
// when
final ResultActions result = mockMvc.perform((get(url)
.accept(MediaType.APPLICATION_JSON));
}
// then
result
.andExpect(status().isOk())
.andExpect(jsonPath("$[0].id").value(savePet.getId()))
.andExpect(jsonPath("$[0].name").value(savePet.getName()));
}
- @SpringBootTest
- @SpringBootTest ์ ๋ํ ์ด์ ์ ๋ฉ์ธ ์ ํ๋ฆฌ์ผ์ด์ ํด๋์ค์ ์ถ๊ฐํ๋ ์ ๋ํ ์ด์ ์ธ @SpringBootApplication์ด ์๋ ํด๋์ค๋ฅผ ์ฐพ๊ณ ๊ทธ ํด๋์ค์ ํฌํจ๋์ด ์๋ ๋น์ ์ฐพ๊ณ ํ ์คํธ์ฉ ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ๋ฅผ ๋ง๋ ๋ค.
- @AutoConfigureMockMvc
- @AutoConfigureMockMvc์ MockMvc๋ฅผ ์์ฑํ๊ณ ์๋์ผ๋ก ๊ตฌ์ฑํ๋ ์ ๋ํ ์ด์ ์ด๋ค.
- MockMvc๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ฒ์ ๋ฐฐํฌํ์ง ์๊ณ ๋ ํ ์คํธ์ฉ MVCํ๊ฒฝ์ ํตํด ์์ฒญ ๋ฐ ์ ์ก, ์๋ต ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์ ํธ๋ฆฌํฐ ํด๋์ค์ด๋ค.
- ์ปจํธ๋กค๋ฌ๋ฅผ ํ ์คํธํ ๋ ์ฌ์ฉ๋๋ค.
- perform()
- ์์ฒญ์ ์ ์กํ๋ ๋ฉ์๋์ด๋ค.
- ResultActions ๊ฐ์ฒด๋ฅผ ๊ฒฐ๊ณผ๋ก ๋ฐ์์ค๋ฉฐ ResultActions๋ ๋ฐํ๊ฐ์ ๊ฒ์ฆํ๊ณ ํ์ธํ๋ andExpect() ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค.
- accept()
- ์์ฒญ์ ๋ณด๋ผ ๋ ๋ฌด์จ ํ์ ์ผ๋ก ์๋ต์ ๋ฐ์์ง ๊ฒฐ์ ํ๋ ๋ฉ์๋์ด๋ค.
- ์ ์ฝ๋์์๋ JSON์ผ๋ก ๋ฐ๋๋ค.
- andExpect()
- ๋ฉ์๋ ์๋ต์ ๊ฒ์ฆ
- jsonPath("$[0].${ํ๋๋ช
}")
- JSON ์๋ต๊ฐ์ ๊ฐ์ ธ์ค๋ ์ญํ ์ ์ํ
** HTTP ์ฃผ์ ์๋ต ์ฝ๋ ๊ฒ์ฆ **
| ๋งคํ ๋ฉ์๋ | ์ฝ๋ |
| isOK() | 200 OK |
| isCreated() | 201 Created |
| isBadRequest() | 400 Bad Request |
| isForbidden() | 403 Forbidden |
| isNotFound() | 404 Not Found |
| is4xxClientError() | 400๋ฒ๋ ์ฝ๋ |
| isInternalServerError() | 500 Internal Server Error |
| is5xxServerError() | 500๋ฒ๋ ์ฝ๋ |
'๐งFramework > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [SpringBoot] ์คํ๋ง ๋ถํธ์ ๊ตฌ์กฐ (0) | 2024.09.15 |
|---|---|
| [SpringBoot] ์คํ๋ง ๋ถํธ ์์๋ณด๊ธฐ - 2 (0) | 2024.09.15 |
| [SpringBoot] ์คํ๋ง ๋ถํธ ์์๋ณด๊ธฐ - 1 (0) | 2024.09.14 |
| [SpringBoot] ์คํ๋ง๊ณผ ์คํ๋ง ๋ถํธ (0) | 2024.09.14 |