한 눈에 들어오는 Test Fixture 구성하기
- Test Fixture
- Fixture: 고정물, 고정되어 있는 물체
- 테스트를 위해 원하는 상태로 고정시킨 일련의 객체
테스트 코드를 작성하다 보면 (BeforeEach, BeforeAll)
@DisplayName("신규 상품을 등록한다. 상품번호는 가장 최근 상품의 상품번호에서 1증가한 값이다.")
@Test
void createProduct() {
// given
Product product1 = createProduct("001", BAKERY, SELLING, "아메리카노", 4000);
}
- 이런 코드를 중복적으로 작성하게 된다.
그래서 이런 방법을 생각해볼 수 있다.
@BeforeAll
static void beforeAll() {
// before class
}
@BeforeEach
void setUp() {
// before method
// 각 테스트 입장에서 봤을 때 : 아예 몰라도 테스트 내용을 이해하는 데에 문제가 없는가?
// 수정해도 모든 테스트에 영향을 주지 않는가?
}
- 써도 될까?
- 아니요.
- 위에 주석에도 써져 있듯이
- 각 테스트 입장에서 봤을 때 : 아예 몰라도 테스트 내용을 이해하는 데에 문제가 없는가?
- 수정해도 모든 테스트에 영향을 주지 않는가?
- 위의 1, 2번에 해당하는 부분만 BeforeAll, BeforeEach를 통해 작성하면 된다.
data.sql을 통해 테스트를 진행하지 말자.
- 테스트용 확인용 데이터를 넣어야 하는게 귀찮네?
INSERT INTO PRODUCT (PRODUCT_NUMBER, TYPE, SELLING_STATUS, NAME, PRICE)
VALUES ('001', 'HANDMADE', 'SELLING', '아메리카노', 4000),
('002', 'HANDMADE', 'HOLD', '카페라떼', 4500),
('003', 'BAKERY', 'STOP_SELLING', '크루아상', 3500);
- 이런 인서트 구문 추가 ~(룰루랄라)
문제점
- 파편화 발생
- 회사에 들어온 신입이 테스트를 진행하고 있는데 Product product = Product.builder() 이런 코드가 given절에 없다.(!?!?)
- data.sql을 찾아봤더니 모르겠는 INSERT가 존재한다.
- 이건 간단한 쿼리문인 경우이지만, 실무에서는 조인을 자주 사용하여 불러오기 마련이다. -> 해석하기 지옥
- 엔티티 구조가 바뀌었을 때 data.sql 들어가서 일일히 바꿔주어야 하는 문제점 존재!
빌더를 만들 때 파라미터에는 테스트 클래스 내에서 필요한 것들만 남겨두는게 좋다.
private Product createProduct(String productNumber, ProductType type,
ProductSellingStatus sellingStatus, String name, int price) {
return Product.builder()
.productNumber(productNumber)
.type(type)
.sellingStatus(sellingStatus)
.name(name)
.price(price)
.build();
}
- 만약에 sellingStatus가 COMPLATE(Enum) 값으로 고정되어 진행되는 테스트만 존재한다.
private Product createProduct(String productNumber, ProductType type,
String name, int price) {
return Product.builder()
.productNumber(productNumber)
.type(type)
.sellingStatus(SellingStatus.COMPLATE)
.name(name)
.price(price)
.build();
}
빌더를 클래스마다 만드려니깐 귀찮다. 한 곳에 모아 쓰면 안 될까?
- 테스트 패키지 전체에서 사용하는 하나의 추상클래스를 만들어서, 모든 빌더들(Fixture)를 모아 놓는 전략
문제점
1.
- 롬북 빌더를 사용하고 있는데..
- 파라미터 값이 매번 달라진다. Equals 새로운 빌더가 계속 생겨난다.
- 실무에 사용하는 엔티티, 객체들은 필드가 수십 개 넘어가는 경우가 대부분
2.
- 테스트 코드를 짜는 여러 명이 각자 필요한 빌더를 만들기 시작
- 너무 많아져 관리가 되지 않음
- 파라미터가 수십 개니깐 순서만 바꿔도 다른 빌더로 인식
- 빌더만 수십개가 넘어가는 상황
'Spring관련 기술 > 테스트코드' 카테고리의 다른 글
Rest docs 참고 사이트 (1) | 2023.12.31 |
---|---|
@ParameterizedTest (0) | 2023.12.25 |
BDD Mockito (0) | 2023.12.24 |
@Mock, @Spy, @InjectMocks (0) | 2023.12.24 |
Test Double (0) | 2023.12.24 |