단위테스트
통합 테스트
두 개 이상의 모듈이 연결된 상태를 테스트 할 수 있다.
모듈 간의 연결에서 발생하는 에러 검증이 가능하다.
단, 설정과 모든 빈들을 스캔하여 등록하기 때문에 동작 시간이 오래 걸리고 무겁다.
@SpringBootTest
: 스프링이 동작되도록 해주는 어노테이션
프로젝트 내부에 있는 모든 스프링 빈들을 스캔하여 등록하고, 애플리케이션 컨텍스트를 생성하여 테스트를 실행한다.
테스트 수행 시 스프링이 동작한다.
Spring IoC/DI 기능 사용 가능하다.
Repository를 사용해 DB CRUD가 가능하다.
@Transactional
@DisplayName
@Test
@DisplayName("테스트의 내용을 한눈에 알아볼 수 있게 네이밍 해줄 수 있습니다.")
void test1() {
System.out.println("테스트의 수행 내용들을 빠르게 파악할 수 있습니다.");
}
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
@Nested
@DisplayName("주제 별로 테스트를 그룹지어서 파악하기 좋습니다.")
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class Test1 {
@Order(1)
@Test
@DisplayName("Test1 클래스")
void test() {
System.out.println("\nTest1 클래스");
}
@Order(3)
@Test
@DisplayName("Test1 - test1()")
void test1() {
System.out.println("Test1.test1");
}
@Order(2)
@Test
@DisplayName("Test1 - test2()")
void test2() {
System.out.println("Test1.test2");
}
}
Test Code 스타일을 표현하는 방식을 뜻한다.
Given(사전 조건)
When(행동)
Then(검증)
import com.sparta.myselectshop.dto.ProductMypriceRequestDto;
import com.sparta.myselectshop.dto.ProductRequestDto;
import com.sparta.myselectshop.dto.ProductResponseDto;
import com.sparta.myselectshop.entity.User;
import com.sparta.myselectshop.entity.UserRoleEnum;
import com.sparta.myselectshop.repository.UserRepository;
import org.junit.jupiter.api.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Page;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
// 서버의 PORT 를 랜덤으로 설정합니다.
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
// 테스트 인스턴스의 생성 단위를 클래스로 변경합니다.
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
@Transactional
class ProductServiceIntegrationTest {
@Autowired
ProductService productService;
@Autowired
UserRepository userRepository;
User user;
ProductResponseDto createdProduct = null;
int updatedMyPrice = -1;
@Test
@Order(1)
@DisplayName("신규 관심상품 등록")
void test1() {
user = new User("yujin", "yj1234567!", "yj1234@naver.com", UserRoleEnum.USER);
userRepository.save(user);
// given
String title = "Apple <b>에어팟</b> 2세대 유선충전 모델 (MV7N2KH/A)";
String imageUrl = "https://shopping-phinf.pstatic.net/main_1862208/18622086330.20200831140839.jpg";
String linkUrl = "https://search.shopping.naver.com/gate.nhn?id=18622086330";
int lPrice = 173900;
ProductRequestDto requestDto = new ProductRequestDto(
title,
imageUrl,
linkUrl,
lPrice
);
User user1 = userRepository.findById(1L).orElse(null);
// when
ProductResponseDto product = productService.createProduct(requestDto, user1);
// then
assertNotNull(product.getId());
assertEquals(title, product.getTitle());
assertEquals(imageUrl, product.getImage());
assertEquals(linkUrl, product.getLink());
assertEquals(lPrice, product.getLprice());
assertEquals(0, product.getMyprice());
createdProduct = product;
}
위의 테스트 코드는 회원이 신규 상품을 등록하기 위한 테스트 코드 예시 이다.
Given절에서는 관심상품을 등록하기 위한 요청 데이터를 설정한다. Dto 객체를 생성하고, 기존의 user 정보를 user1로 가져온다.
when절에서는 productService.createProduct() 메서드를 호출하여 상품을 생성한다. 이 때, 설정한 Dto와 user1을 인자로 전달한다.
Then절에서는 생성된 상품 아이디가 null
이 아닌지 확인하고, 요청 데이터와 실제 응답 데이터가 일치하는지 검증한다.
https://caffeineoverflow.tistory.com/144
https://curiousjinan.tistory.com/entry/integration-vs-unit-testing