한 문단에 한 주제
보통 글을 작성할 때 한 문단에 하나의 주제를 두고 작성하라고 많이 듣는다.
테스트 또한 하나의 테스트는 하나의 주제만을 가지고 테스트를 하면 좋다.
즉 하나의 테스트 안에 여러 가지를 테스트하는 것이 아닌 테스트를 분리하는 것이 좋다.
테스트 환경의 독립성을 보장하자
최대한 생성자를 이용해서 given을 작성하자 내부 함수를 사용해서 given을 작성하는 경우 내부 함수에 대한 이해가 추가적으로 필요하고 내부 함수에서 오류가 발생할 수 있다.
테스트 간 독립성을 보장하자
두 가지 이상의 테스트는 하나의 자원을 공유하면 안 된다.
즉 static 한 변수를 공유해서 테스트를 하면 테스트 간 영향을 주니 사용하지 않아야 한다.
또 테스트간 순서에 상관이 없어야 한다.
어떤 테스트가 먼저 실행되어야 하는 경우를 만들면 안 된다.
한눈에 들어오는 Test Fixture
테스트를 위해 원하는 상태로 고정시킨 일련의 객체를 Test Fixture이라고 한다.
setUp 함수 (BeforeEach, AfterAll etc..)
1. 사용은 각 테스트 입장에서 봤을 때 아예 몰라도 테스트 내용을 이해하는 데 문제가 없을 때 사용
2. 수정해도 모든 테스트에 영향을 주지 않으면 사용
다른 부분은 given절에 작성하여 테스트의 가독성을 높이자.
빌더 패턴을 사용할 때 테스트에 포함되지 않는 파라미터는 임의로 넣어주자
Test Fixture 클렌징
@AfterEach에서 tearDown함수를 적용할 때
deleteAll 함수와 deleteAllInBatch 함수 둘 중 선택할 수 있다.
deleteAll의 장점은 fk의 참조와 상관없이 지워줄 수 있다. (orderProduct테이블이 order테이블을 참조할 때 order테이블을 지우면 자동으로 orderProduct 테이블이 지워진다.)
1. order테이블을 selete 한다.
2. order테이블과 관련이 있는 orderProduct테이블을 지운다.
3. orderProduct의 칼럼을 하나씩 delete문을 사용해서 지운다 (2개의 칼럼이 있으면 2개의 delete필요)
4. order테이블을 지운다.
이로 인해 성능에 문제가 생길 수 있다.
그러므로 deleteAllInBatch를 순서를 잘 고려해서 사용하자.
@ParameterizedTest
하나의 테스트 케이스에 대해 값을 바꿔가면서 테스트를 진행할 때 사용할 수 있다.
@DisplayName("상품 타입이 재고 관련 타입인지를 체크한다.")
@CsvSource({"HANDMADE, flase"}, {"BOTTLE, true"}, {"BAKERY, true"})
@ParameterizedTest
void containsStockType(ProductType productType, boolean expected){
}
위와 같은 코드에서 CsvScoure의 값이 함수의 파라미터로 들어오게 된다.
@DynamicTest
공통의 환경에서 시나리오로 테스트를 진행하고 싶은 경우 아래와 같이 사용할 수 있다.
@DisplayName("재고 차감 시나리오")
@TestFactory
Collection<DynamicTest> stockDeductionDynamicTest() {
// given
Stock stock = Stock.create("001", 1);
return List.of(
DynamicTest.dynamicTest("재고를 주어진 개수만큼 차감할 수 있다.", () -> {
// given
int quantity = 1;
// when
stock.deductQuantity(quantity);
// then
assertThat(stock.getQuantity()).isZero();
}),
DynamicTest.dynamicTest("재고보다 많은 수의 수량으로 차감 시도하는 경우 예외가 발생한다.", () -> {
// given
int quantity = 1;
// when // then
assertThatThrownBy(() -> stock.deductQuantity(quantity))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("차감할 재고 수량이 없습니다.");
})
);
}
'TestCode' 카테고리의 다른 글
private 메서드 테스트 (0) | 2024.07.18 |
---|---|
테스트 Spring boot 띄어지는 수 줄이기 (0) | 2024.07.18 |
classicist vs mockist (0) | 2024.07.17 |
Mockito.verify (0) | 2024.07.16 |
Mock 사용하기 (@Mock, @InjectMocks, @Spy) (0) | 2024.07.16 |