코드 작성
애플리케이션 실행
Request 요청
로그 또는 print로 결과 검증
에러 발생 또는 원하는 결과가 아닌 경우 종료
다시 코드 작성
위와 같은 과정이 반복된다면 비용이 많이 발생
테스트 코드 작성
테스트 코드 실행
결과 검증
테스트 코드 수정
테스트 코드를 사용하면 애플리케이션을 실행하고 종료할 필요가 없음
장점
단점
장점
단점
Java에서 독립된 단위 테스트를 지원해주는 프레임워크
Assert(검증)을 이용해서 결과를 기댓값과 실제 값을 비교
@Test 어노테이션마다 독립적으로 테스트가 진행
spring-boot-test: 테스트에 필요한 핵심 기능 라이브러리
spring-boot-test-autoconfigure: 테스트 진행 위한 Configuration 라이브러리
테스트 코드 작성하지 않고 바로 실제 코드만 작성한 경우
도메인 테스트
package com.ssafy.user.dto.entity;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
// @DataJpaTest -> JPA 사용 시 붙이기
class UserDomainTest {
@Test
@DisplayName("사용자 생성 테스트")
void createMember() {
// given
User user = User.builder().loginId("test").nickname("name").build();
// when, then
Assertions.assertThat(user.getLoginId()).isEqualTo("test");
Assertions.assertThat(user.getNickname()).isEqualTo("name");
}
@Test
@DisplayName("사용자의 닉네임 바뀌는지 확인하는 테스트")
void changeNicknameTest(){
// given
User user = User.builder().loginId("test").nickname("name").build();
// when
user.changeNickname("newName");
// then
// Assertions.assertThat(user.getNickname()).isEqualTo("newName");
Assertions.assertThat(user.getNickname()).isEqualTo("change");
}
}
@Test
@DisplayName
실행 결과
동시에 실행도 가능 → 모두 독립적으로 실행되기에 같이 돌려도 결과에 미치는 영향은 없음
JPA를 사용하는 경우
@DataJpaTest
사용 (클래스에 붙이는 것)@Transaction
을 포함하고 있어서 1개 의 테스트가 끝나면 Rollback → 다른 테스트에게 영향을 미치지 않음서비스 테스트
ExtendWith(SpringExtension.class)
public class UserServiceTest {
// Test 주체
UserService userService;
// Test 협력자
@MockBean
UserDao userDao;
// Test를 실행하기 전마다 UserService 에 가짜 객체를 주입
@BeforeEach
void setUp() {
userService= new userService(userDao);
}
}
@ExtendWith(SpringExtension.class)
를 붙이기@BeforeEach
@MockBean
컨트롤러 테스트
@WebMvcTest(UserController.class)
public class UserControllerTest {
@Autowired
MockMvc mvc;
@MockBean
UserService userService;
}
@WebMvcTest
****붙이기@WebMvcTest(UserController.class)
: 테스트 주체 작성 가능@MockBean
: 테스트 협력자 위에 붙이기 → 컨트롤러를 테스트 할 경우에는 서비스를 협력자로 등록MockMvc
는 실제로 서블릿 컨테이너를 사용하지 않고, 테스트용으로 MVC 기능을 사용할 수 있게 해주는 역할WebApplicationContext
에서 주입 받음