Back-end/Spring Boot

[Spring Boot] TDD

Bay Im 2024. 4. 13. 12:48

테스트 주도 개발 (Test Driven Development, TDD)

  • 테스트 관련 어노테이션 및 클래스
    • @WebMvcTest
      • @Controller, @RestController가 설정된 컨트롤 클래스를 테스트한다.
      • @Service, @Repository에는 사용할 수 없다.
    • MockMvc
      • 웹 API를 테스트할 때 가상의 HTTP 요청을 만들어주는 클래스이다.
    • @Disabled
      • 테스트 메소드를 비활성화 시키는 어노테이션
    • @BeforeAll
      • 테스트 클래스 기준으로 테스트 메소드들이 실행되기 전에 한번만 실행
    • @AfterAll
      • 테스트 클래스 기준으로 테스트 메소드들이 실행된 후에 한번만 실행
      • 예로 리소스 정리 같은 코드 작성
    • @BeforeEach
      • 각 테스트 메소드가 실행되기 전에 매번 실행
    • @AfterEach
      • 각 테스트 메소드가 실행된 후에 매번 실행
  • 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를 각각 다 실행한다. 중간에 멈추지 않는다.
    • 예시
      •     @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();
              }
  • 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());
              }
          }

 

728x90