초보자를 위한 팁
Fixture Monkey 사용을 위한 필수 팁
1. 타입 안전한 메서드 사용하기
- 문자열 기반 메서드보다 타입 안전한 메서드를 선호하세요
- 예시:
// 이렇게 하지 말고
.set("price", 1000L)
// 이렇게 사용하세요
.set(javaGetter(Product::getPrice), 1000L)
2. 의미 있는 테스트 데이터 사용하기
- 테스트 맥락에서 의미가 있는 값을 사용하세요
- “test"나 “123"과 같은 임의의 값을 피하세요
- 비즈니스 규칙과 제약 조건을 고려하여 값을 설정하세요
- 장점:
- 테스트가 더 읽기 쉽고 자체 문서화됩니다
- 테스트 실패를 더 빠르게 파악할 수 있습니다
- 테스트 시나리오를 이해하기 쉬워집니다
- 추가 주석이 필요 없어집니다
- 예시:
// 의미 있는 값 사용
Product product = fixtureMonkey.giveMeBuilder(Product.class)
.set("price", 1000L) // 비즈니스 규칙에 맞는 실제적인 가격 사용
.set("name", "프리미엄 상품") // 상품 유형을 나타내는 설명적인 이름 사용
.set("category", "ELECTRONICS") // 도메인에서 유효한 카테고리 사용
.set("stock", 50) // 적절한 재고 수량 사용
.sample();
3. 테스트 가독성 유지하기
- 특정 값을 설정하는 이유를 주석으로 설명하세요
- 예시:
Product product = fixtureMonkey.giveMeBuilder(Product.class)
.set("price", 2000L) // 할인 기준 이상의 가격
.set("category", "PREMIUM") // 특별한 처리가 필요한 카테고리
.sample();
4. 컬렉션 올바르게 다루기
- 특정 인덱스를 접근하기 전에 컬렉션 크기를 먼저 설정하세요
- 예시:
Product product = fixtureMonkey.giveMeBuilder(Product.class)
.size("options", 3) // 먼저 크기 설정
.set("options[1]", "red") // 그 다음 특정 인덱스 접근
.sample();
5. FixtureMonkey 인스턴스 재사용하기
- 하나의 인스턴스를 생성하고 여러 테스트에서 재사용하세요
- 예시:
public class ProductTest {
private static final FixtureMonkey FIXTURE_MONKEY = FixtureMonkey.builder()
.objectIntrospector(ConstructorPropertiesArbitraryIntrospector.INSTANCE)
.build();
@Test
void test1() {
Product product = FIXTURE_MONKEY.giveMeBuilder(Product.class).sample();
// ...
}
@Test
void test2() {
Product product = FIXTURE_MONKEY.giveMeBuilder(Product.class).sample();
// ...
}
}
6. ArbitraryBuilder 재사용하기
- ArbitraryBuilder 인스턴스를 재사용하여 테스트 데이터 구조의 일관성을 유지하세요
- 여러 테스트에서 공통 설정을 공유할 수 있습니다
- 테스트 데이터 설정을 중앙화하여 코드 가독성을 향상시킬 수 있습니다
- 예시:
public class ProductTest {
private static final FixtureMonkey FIXTURE_MONKEY = FixtureMonkey.builder()
.objectIntrospector(ConstructorPropertiesArbitraryIntrospector.INSTANCE)
.build();
// 프리미엄 상품에 대한 기본 설정
private static final ArbitraryBuilder<Product> PREMIUM_PRODUCT_BUILDER = FIXTURE_MONKEY.giveMeBuilder(Product.class)
.set("category", "PREMIUM")
.set("price", 1000L);
@Test
void testDiscountForPremiumProduct() {
// 할인 기준 이상의 가격으로 프리미엄 상품 테스트
Product product = PREMIUM_PRODUCT_BUILDER
.set("price", 2000L) // 할인 기준 이상의 가격
.sample();
// 할인 로직 테스트
}
@Test
void testShippingForPremiumProduct() {
// 무료 배송 기준 이상의 가격으로 프리미엄 상품 테스트
Product product = PREMIUM_PRODUCT_BUILDER
.set("price", 5000L) // 무료 배송 기준 이상의 가격
.sample();
// 배송 로직 테스트
}
}
7. 간단한 객체부터 시작하기
- 복잡한 객체로 넘어가기 전에 기본적인 객체부터 시작하세요
- 예시:
public class ProductTest {
private static final FixtureMonkey FIXTURE_MONKEY = FixtureMonkey.builder()
.objectIntrospector(ConstructorPropertiesArbitraryIntrospector.INSTANCE)
.build();
@Test
void testBasicProduct() {
// 간단한 객체부터 시작
Product product = FIXTURE_MONKEY.giveMeBuilder(Product.class)
.set("name", "테스트 상품")
.sample();
// ...
}
}
8. IntelliJ 플러그인 사용하기
Fixture Monkey Helper 플러그인을 설치하여 개발 경험을 향상시키세요:
- Fixture Monkey 메서드에 대한 스마트 코드 완성
- 메서드 참조를 사용한 타입 안전한 필드 접근 제안
- 필드 정의로 빠르게 이동
- Fixture Monkey 클래스에 대한 자동 import 제안
- 필드 이름과 타입에 대한 실시간 검증
9. 일반적인 사용 사례
- 검증 규칙 테스트
- 특정 조건의 비즈니스 로직 테스트
- 통합 테스트를 위한 테스트 데이터 생성
- 유효한 랜덤 테스트 데이터 생성
10. 모범 사례
- 테스트 데이터 생성은 사용하는 곳 가까이에 두세요
- 의미 있는 변수명을 사용하세요
- 복잡한 테스트 시나리오를 문서화하세요
- 자주 사용하는 값은 상수로 정의하세요