EasyRandom

프로젝트를 진행하면 빈번하게 테스트를 위한 데이터를 만들어줘야하는 번거로움이 생긴다.

필요한 데이터 수가 적다면 큰 문제가 되지 않지만, 많은 양의 테스트 데이터를 필요로 하는 테스트가 여럿 있다면 굉장히 힘들어진다.

이미 선배 개발자들이 이런 번거로움을 겪고 만든 디자인 패턴인 Object Mother 라는 패턴도 있었다.

이러한 번거로움을 줄이고자 좋은 라이브러리들도 나왔다.

그 중 이지 랜덤이라는 라이브러리를 사용해보려한다.


EasyRandom 써보기

사용법은 이지랜덤 깃허브 링크에도 잘 나와있다.

의존성 추가를 위해 아래 코드를 build.gradle에 추가해준다.

// build.gradle.kts
// EasyRandom
implementation("org.jeasy:easy-random-core:5.0.0")

 

우선 내가 만들 데이터의 조건은 아래와 같았다.

  • 데이터의 ID 값은 DB Insert 시 Auto Increment로 만들어야 하므로 null 값이어야 한다.
  • 테이블 조인에 사용할 FK인 memberId는 특정 값으로 넣을 수 있어야 한다.
  • 데이터의 생성 일자는 특정 날짜 사이의 랜덤 값을 이용해야 한다.

원래라면 이런 조건을 생각하면서 테스트용 객체를 어떻게 생성할지 고려해야겠지만

이지 랜덤을 사용하면 아래처럼 쉽게 사용할 수 있었다.

PostFixtureFactory

public class PostFixtureFactory {

    public static EasyRandom get(Long memberId, LocalDate firstDate, LocalDate lastDate) {
        Predicate<Field> idPredicate = named("id")
            .and(ofType(Long.class))
            .and(inClass(Post.class));

        Predicate<Field> memberIdPredicate = named("memberId")
            .and(ofType(Long.class))
            .and(inClass(Post.class));

        EasyRandomParameters param = new EasyRandomParameters()
            .excludeField(idPredicate)
            .dateRange(firstDate, lastDate)
            .randomize(memberIdPredicate, () -> memberId);

        return new EasyRandom(param);
    }
}

ㄴexcludeField

기본적으로 모든 필드를 랜덤화 해주지만, excludeField로 특정 필드를 랜덤화 하지 않을 수 있다.

본인은 Auto Increment를 위해 생성한 객체의 Id 값이 null 이여야 하므로 여기서 사용했다.

ㄴdateRange

LocalDateTime을 firstDate, lastDate 사이의 랜덤 값으로 사용하기 위해 사용했다.

ㄴrandomize

기본적으로 랜덤한 값을 넣지만 위처럼 콜백에 특정 값을 지정해주면 특정 값으로 삽입한다.

 

이 외에도 많은 기능을 제공한다.

공식 문서를 참고해서 사용해보면 굉장히 편하게 테스트 객체를 생성할 수 있을것 같다.

Test

테스트 클래스에서 아래처럼 사용할 수 있다.

@DisplayName("이지 랜덤으로 객체를 생성한다.")
@Test
void test() {
    Long memberId = 1L;
    EasyRandom easyRandom = PostFixtureFactory.get(
        memberId,
        LocalDate.of(2024, 5, 26),
        LocalDate.of(2024, 5, 27)
    );

    List<Post> posts = IntStream.range(0, 10)
        .mapToObj(i -> easyRandom.nextObject(Post.class))
        .toList();

    for (Post post : posts) {
        System.out.println(post);
    }
}

결과

내가 원한대로 Id는 null, memberId는 특정 값(1L), 생성 일자는 26~27일 사이의 객체를 만들 수 있었다.

 

참고자료

 

백엔드 개발자를 위한 한 번에 끝내는 대용량 데이터 & 트래픽 처리 | 패스트캠퍼스

데이터 처리 4대장 : MySQL, MongoDB, Kafka, Redis 외 31가지 기술스택 활용을 담은 초격차 강의! 실무 경험에 기반한 18가지 Use Case와 105개 실습 클립으로 대용량 테이터 & 처리를 완벽하게 경험해보세요!

fastcampus.co.kr

 

데이터가 필요해...!!(Object Mother와 EasyRandom)

예제 객체를 마구마구 생성해주는 EasyRanom 사용기입니다

velog.io

 

 

'백엔드 > 연습' 카테고리의 다른 글

Prometheus를 이용하여 메트릭 수집  (0) 2024.06.06
Spring Boot Actuator 써보기  (0) 2024.06.05
QueryDSL 적용하기: gradle-kotlin  (0) 2024.05.13
포트원 API 사용해보기  (0) 2024.04.04
plain-jar 파일 생성 방지  (0) 2024.01.16

+ Recent posts