Java

Test Fixture 란

현인 2023. 4. 21. 01:49

Test Fixture란?

  • Test Fixture:소프트웨어 테스트에서 필요한 테스트 데이터나 환경을 정의하는 코드 조각입니다

 

즉, 테스트에 필요한 Test Data의 생성을 쉽게 도와주는 라이브러리입니다.

 

 @BeforeEach
    void 유저_세팅() {
        //given
        User user = User.builder()
                .oauthIdx("68847615")
                .email("hyunin0102@gmail.com")
                .name("홍현인")
                .profileImageUrl("https://avatars.githubusercontent.com/u/68847615?v=4")
                .bio("한줄소개")
                .field(BACKEND)
                .url("https://github.com/honghyunin")
                .isFirstVisited(true)
                .refreshToken("refreshToken")
                .githubId("honghyunin12")
                .build();

        userRepository.save(user);

        UserLanguage userLanguage = UserLanguage.builder()
                .id(null)
                .language(SPRINGBOOT)
                .user(user)
                .build();

        Roles roles = Roles.builder()
                .id(null)
                .role(Role.ROLE_USER)
                .user(user)
                .build();

        rolesRepository.save(roles);
        userLanguageRepository.save(userLanguage);
    }

테스트 할 때 이런 코드를 작성해본 경험이 있지 않으신가요?

 

위와 같이 가정해야할 대상이 많아지거나, 해당 객체가 변경이 되면 그에 맞추어 코드를 변경해주어야 할 경우 정말 번거로운 일이 발생합니다

다양한 Fixture 라이브러리

위와 같은 번거로운 일을 줄이기 위해 개발자들은 또 열심히 노력해서 이런 상황을 해결할 수 있는 다음의 라이브러리들을 만들었습니다!

  1. Java Faker
  2. Fixture Monkey
  3. Just Do It

1. Data(or Kotlin) Faker

Data Faker는 객체에 랜덤한 값을 지정해주는 함수를 제공하는 라이브러리입니다.

환경구성

build.gradle

implementation 'net.datafaker:datafaker:1.8.1'

메소드 호출

Faker 객체 생성 후 아래와 같이 테스트 데이터를 생성하면 됩니다

 

Java Faker 사용 예제
실행 결과

한글 등 다른 locale의 테스트 데이터가 필요한 경우 생성자에 Locale 이름을 추가해주면 됩니다

Faker faker = new Faker(new Locale("ko"));

JSON

expression() 메서드를 통해 표현식을 사용하면 JSON 형식으로 데이터를 생성할 수 있습니다

 

json 사용 예제
json 실행 결과

컬렉션

Data Collection을 통해 List 데이터도 만들 수 있습니다.

 

컬렉션 사용 예제
컬렉션 실행 결과

서로 다른 타입의 값을 혼합하는 상황을 만들 수도 있습니다

혼합 타입 컬렉션 예제
혼합 타입 실행 결과

2. Fixture Monkey

Fixtures Monkey는 네이버페이에서 만든 PBT 오픈소스 도구입니다 자바의 PBT 도구인 Jqwik을 기반으로 만들어졌습니다

자세한 내용은 공식 문서에 작성되어 있습니다

Gradle

testImplementation("com.navercorp.fixturemonkey:fixture-monkey-jackson:0.4.14")testImplementation("com.navercorp.fixturemonkey:fixture-monkey-starter:0.5.0")

기본적으로 자바/Junit5를 지원하며 필요에 따라 아래와 같은 서드파티 모듈들을 사용할 수 있습니다.

사용법

Fixture Monkey는 의존성을 추가하고 Setter만 추가해주면 바로 사용이 가능합니다.

  • FixtureMonkey.create()를 통해 손쉽게 데이터 빌더를 생성하고 이를 이용해 데이터를 생성합니다

Fixure monkey 사용 예제

테스트에 사용된 객체 코드입니다

 

 

 

fixture monkey 실행 결과

자세한 사용법

생성 전략

생성 전략은 여러가지가 존재하는데요, 기본적인 생성 전략은 BeanArbiyraryGenerator 로 자바빈즈 규칙에 따라 Setter로 생성합니다.

BeanArbitraryIntrospector

필요조건

  1. 클래스가 파라미터가 없는 빈 생성자를 가지고 있습니다.
  2. 클래스에 세터가 존재합니다

특별한 설정이 필요하다면 giveMeBuilder()를 통해서 원하는 빌더 객체로 커스텀할 수 있습니다 (AribitrayBuilder 반환)

Bean Validation 적용

Fixture Monkey는 따로 설정할 필요 없이 자바의 표준 Bean Validation 2.0 어노테이션(JSR-303, JSR-380)을 이용하여 데이터를 생성할 수도 있습니다.

@Not Null 이나 @Not Blank 와 같은 옵션을 적용하기 위해서는 해당 의존성을 추가하고 다음의 코드로 FixtureMonkey를 생성하면 됩니다

gradle

testImplementation("com.navercorp.fixturemonkey:fixture-monkey-javax-validation:0.5.0")

Code

validation fixture monkey 사용 예제

3. Just Do It

다른 라이브러리를 사용해보기 전에 저는 따로 Fixtures 파일을 만들어서 분리하여 관리했는데요! 조금 귀찮지만서도 테스트 코드에는 대상과 상황만 작성할 수 있어서 너무나 뿌듯했습니다.

예시)

  • Kotest와 Mockk로 작성한 테스트 코드의 일부분입니다

MemberFixtures.kt

 

MemberServiceTest.kt

@BeforeEach를 통한 테스트 데이터를 세팅하는 코드가 없어, 테스트 작성에만 신경 쓸 수 있고 가독성도 향상되어 보기에 매우 깔끔합니다!

하지만 결국 데이터를 직접적으로 넣어주게 되는 것은 동일하므로 번거로울 수 있지만, 한 번 선언해두면 다른 테스트에서 호출하여 재사용할 수 있습니다