테스트 주도 개발 (Test Driven Development, TDD)
- 테스트 관련 어노테이션 및 클래스
- @WebMvcTest
- @Controller, @RestController가 설정된 컨트롤 클래스를 테스트한다.
- @Service, @Repository에는 사용할 수 없다.
- MockMvc
- 웹 API를 테스트할 때 가상의 HTTP 요청을 만들어주는 클래스이다.
- @Disabled
- 테스트 메소드를 비활성화 시키는 어노테이션
- @BeforeAll
- 테스트 클래스 기준으로 테스트 메소드들이 실행되기 전에 한번만 실행
- @AfterAll
- 테스트 클래스 기준으로 테스트 메소드들이 실행된 후에 한번만 실행
- 예로 리소스 정리 같은 코드 작성
- @BeforeEach
- 각 테스트 메소드가 실행되기 전에 매번 실행
- @AfterEach
- 각 테스트 메소드가 실행된 후에 매번 실행
- @WebMvcTest
- Assert 함수
- 테스트 케이스의 수행 결과를 판별하는 메소드
- 종류
- assertArrayEquals(a, b)
- 배열 a와 b가 일치함을 확인한다.
- assertEquals(a, b)
- 객체 a와 b가 일치함을 확인한다.
- 객체에 정의되어 있는 equals를 통해 비교한다.
- assertSame(a, b)
- 객체 a와 b 가 같은 객체임을 확인 한다.
- 객체 자체를 비교한다. (==)
- assertTrue(a)
- 조건 a가 참인지를 확인한다.
- assertFalse(a)
- 조건 a가 거짓인지를 확인한다.
- assertNotNull(a)
- 객체 a가 null인지 확인한다.
- assertAll()
- 모든 종류의 assert를 각각 다 실행한다. 중간에 멈추지 않는다.
- assertArrayEquals(a, b)
- 예시
-
@Test void assertTest(){ assertArrayEquals( arr1, arr1 ); assertArrayEquals( arr1, arr2 ); // 값 비교 assertEquals( 3, adder.add(1, 2) ); // 주소값 비교 assertSame( adder, adder ); assertSame( adder, arr1 ); // 조건절이 true일때 통과 assertTrue( 10 < 20 ); assertTrue( 10 > 20 ); // 조건절이 false일때 통과 assertFalse( 10 > 20 ); // null이 아니면 통과 assertNotNull( adder ); assertNotNull( null ); // 람다식 리스트 assertAll( () -> assertFalse(false, "Exception"), () ->{ Object obj = new Object(); assertNotNull(obj, "not null"); } ); }
-
- AssertJ 라이브러리
- JUnit5의 Assert 함수와 비슷한 라이브러리
- assertThat으로 시작하는 함수들이다.
- 메소드 체이닝을 지원하기 때문에 좀더 깔끔하고 읽기쉬운 테스트 코드를 작성할 수 있다.
- 개발자가 테스트하면서 필요한 대부분의 메소드 제공
- AssertJ 사용 방법
- dependencies 추가
- testCompile 'org.assertj:assertj-core:3.6.2'
- BDD (행동주도개발) 단계로 테스트 하기
- given(초기값) - when(조건) - then(기대하는 결과값 )
- 예시
-
@Test @DisplayName("isTrue 테스트") void test1() { // given // when User user = new User("hong", "", "bank@gmail.com"); // then Assertions.assertThat("".isEmpty()).isTrue(); Assertions.assertThat(user.getName().isEmpty()).isFalse(); Assertions.assertThat(user.getNickname().isEmpty()).isTrue(); }
-
- dependencies 추가
- Controller Test 방법
- build.gralde- dependencies 추가
-
implementation 'com.google.code.gson:gson' //gson 의존성 추가 : json구조를 띄는 직렬화된 데이터를 JAVA의 객체로 역직렬화, 직렬화 해주는 자바 라이브러리 testCompileOnly 'org.projectlombok:lombok' // lombok 테스트 의존성 추가 testAnnotationProcessor 'org.projectlombok:lombok' // lombok 테스트 의존성 추가
-
- Controller 클래스 작성
- Controller 이름에서 마우스 오른쪽- Generate- Test 클릭 후 테스트할 메소드 클릭 후 OK
- ControllerTest 클래스 자동 생성 완료
- ControllerTest 클래스
- 클래스에 어노테이션 주입
- @WebMvcTest(Controller클래스명.class)
- MockMvc 생성자 주입
- 해당 변수에 @Autowired 어노테이션 주입
- @Autowired private MockMvc mockMvc;
- 테스트 메소드 작성
- 메소드에 어노테이션 주입
- @Test
- @Displayname(”콘솔에 출력할 이름”)
- mockMvc.perform() 사용하여 작성
- perform() 사용 시 메소드는 throws Exception으로 예외처리 해야한다.
- 메소드에 어노테이션 주입
- 예시
-
import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.test.web.servlet.MockMvc; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @WebMvcTest(MainController.class) class MainControllerTest { @Autowired private MockMvc mockMvc; @Test @DisplayName("main() 테스트") void main() throws Exception { Member member = new Member("hong", "1234"); mockMvc.perform(get("/")) .andExpect(status().isOk()) .andExpect(view().name("index")) .andExpect(model().attributeExists("member")) // .andExpect(model().attribute("member", member)) .andExpect(model().attribute("list", Matchers.contains("hong", "lee"))) .andDo(print()); } }
-
- 클래스에 어노테이션 주입
- build.gralde- dependencies 추가
728x90
'Back-end > Spring Boot' 카테고리의 다른 글
[Spring Boot] Repository - Service - Controller (0) | 2024.04.21 |
---|---|
[Spring Boot] Scheduler (0) | 2024.04.13 |
[Spring Boot] MyBatis (0) | 2024.04.13 |
[Spring Boot] URI 어노테이션 (0) | 2024.04.06 |
[Spring DB] DB 관련 어노테이션, 데이터 모델링 클래스 (0) | 2024.04.06 |