백엔드 개발자 블로그

테스트 본문

Test

테스트

backend-dev 2023. 8. 22. 10:23

Junit

설정

build.gradle에 dependency에 추가

  • testImplementation('org.springframework.boot:spring-boot-starter-test')

통합

@SpringBootTest : 다 불러와서 무거워짐 -> 필요한 class만 부르기 가능

Controller

  1. @WebMvcTest(Controller이름.class) : 사용할 Controller scan
  2. @MockBean : 사용할 Service 가짜객체 사용
  3. @Autowired : mvc에 가짜객체 주입
  4. @Test : 테스트 함수 지정
    1. given : 입력, 결과
    2. Product productStub = new Product("product-test"); productStub.setProductId("fc00ddb5-9f05-40a0-beb9-4ea5431379c0"); given(sampleService.getProduct(any())) .willReturn(productStub);
    3. when : 실행
    4. final ResultActions actions = mockMvc.perform(MockMvcRequestBuilders.get("/user/getProduct").param("productId", productId));
    5. then : 확인
    6. actions .andDo(print()) .andExpect(status().isOk()) .andExpect(jsonPath("$.productId").value(productId));

Service

  1. @ExtendWith(MockitoExtension.class) : Scan
  2. @Mock : Service에 DI 할 class 가짜 객체 생성
  3. @InjectMocks : 사용하는 Service에 생성한 가짜 객체들 주입
  4. @Spy private ModelMapper modelMapper : modelMapper(entity - > dto) DI
  5. @Test : 테스트 함수 지정
    1. 테스트 함수 작성
      1. given : 인수, mock 객체의 함수 결과값, 예상값 설정
      2. // 인수 productId = "yg" // mock 객체의 함수 결과값 given(productRepo.findById(any())).willReturn(Optional.of(new Product("product-test")));
      3. when : 함수 실행
      4. 변수 = Service.method(인수);
      5. then : 결과 확인
      6. // null 확인 assertNotNull(product); // 값 비교 assertThat(결과값).isSameAs(예상값); // 에러 확인 Assertions.assertThrows(Exeption class, () -> Service method);

Repository

보통 안함

  1. H2 vs JDBC
    1. H2인 경우 추가
      1. @AutoConfigureTestDatabase(replace = Replace.NONE)
      2. 자동을 설정되는 DB 정보를 사용하지 않고
      3. @Import(H2ServerConfiguration.class)
      4. H2ServerConfiuration을 씀
  2. @DataJpaTest : 사용할 Repository scan
  3. @Autowired : 테스트 : respository에 필요한 의존 객체 주입
  4. @Test : 테스트 함수 지정
  5. @Test void testSave() { // given Product product = new Product(); product.setProductName("tset-prd"); List<Item> items = new ArrayList<Item>(); for(int i = 0 ; i < 4 ; i++) { Item item = new Item(); item.setItemId("test-item-"+i); item.setItemName("test-item-"+i); item.setItemNumber("test-item-"+i); item.setProduct(product); } product.setItems(items); productRepo.save(product); // when String productId = product.getProductId(); Product findProduct = productRepo.findById(productId).orElse(null); // then Assertions.assertNotNull(findProduct); Assertions.assertEquals(findProduct.getProductId(), productId); }

Spock

  • 함수이름 한글로도 가능
  • 코드블록으로 구분되어있음(given,when,then)
  • Junit 요소들 모두 제공
  • 중복코드 제거 가능(where)

  • PostMan

'Test' 카테고리의 다른 글

테스트 코드 성능 개선기  (0) 2024.05.09
테스트 코드  (0) 2024.05.08
성능 테스트  (0) 2024.03.18
Spock을 통한 단위 테스트  (0) 2023.08.22