Instancio: 단위 테스트용 데이터 생성기

10573 단어 javatesting
이 게시물은 단위 테스트에서 수동 데이터 설정을 줄이는 방법에 관한 것입니다. 일반적으로 이러한 설정에는 일부 클래스를 인스턴스화하고 여러 setter를 호출하는 작업이 포함됩니다. 예를 들어 다음 테스트에서 이것은 createBookDTO() 메서드에서 수행됩니다.

참고: 끝에 제공된 소스 코드에 대한 링크.

// Class under test
private final BookMapper bookMapper = new BookMapper();

@Test
void map() {
    // Given
    BookDTO bookDto = createBookDTO();

    // When
    Book book = bookMapper.toEntity(bookDto);

    // Then
assertThat(book.getTitle()).isEqualTo(bookDto.getBookTitle());
    // ... snip ... remaining assertions
}

// Data setup
private BookDTO createBookDTO() {
     AuthorDTO authorDto = new AuthorDTO();
     authorDto.setAuthorId(UUID.randomUUID().toString());
     authorDto.setFirstName("Jane");
     authorDto.setLastName("Doe");

     BookDTO bookDto = new BookDTO();
     bookDto.setBookId(UUID.randomUUID().toString());
     bookDto.setIsbn("test-isbn");
     bookDto.setBookTitle("test-title");
     bookDto.setAuthor(authorDto);
     bookDto.setGenre(Genre.FICTION);
     bookDto.setPublishedOn(LocalDate.of(1865, 3, 17));
     bookDto.setNumberOfPages(123);
     bookDto.setPriceCents(3099);
     return bookDto;
}

createBookDTO()에서 수행된 설정은 단위 테스트에 매우 일반적입니다. 그러나 특히 대규모 클래스를 처리할 때 상당히 지루할 수 있습니다. 게다가 가치 자체는 실제로 중요하지 않은 경우가 많습니다. 이름을 "Jane Doe"로 설정하든 "Foo Bar"로 설정하든 상관 없습니다. 최종 결과는 동일합니다.

값이 중요하지 않다면 라이브러리를 사용하여 임의의 데이터로 개체를 생성하고 채우는 것은 어떻습니까? 이것이 바로 Instancio가 하는 일입니다. 단위 테스트를 위한 객체를 생성하는 라이브러리입니다. Instancio를 사용하여 다음과 같이 BookDTO 인스턴스를 생성할 수 있습니다.

private BookDTO createBookDTO() {
    return Instancio.create(BookDTO.class);
}


이것은 올바른 방향으로 나아가는 단계처럼 보이지만 BookDTO의 일부 값을 사용자 지정해야 하는 경우에는 어떻게 해야 합니까? 테스트 중인 BookMapper 클래스가 문자열 UUID 값을 UUID 유형으로 변환한다고 가정해 보겠습니다.

UUID.fromString(bookId) // need a valid UUID string!


이 경우 테스트 개체에 유효한 ID가 포함되어 있지 않으면 테스트가 실패합니다(원래 setAuthorId() 메서드의 setBookId()createBookDTO()가 모두 UUID.randomUUID().toString() 로 설정됨). 이를 달성하기 위해 Instancio의 빌더 API를 사용하여 사용자 정의 값을 설정할 수 있습니다.

Instancio.of(BookDTO.class)
    .set(field(BookDTO.class, "bookId"), UUID.randomUUID().toString())
    .set(field(AuthorDTO.class, "authorId"), UUID.randomUUID().toString())
    .create();


이 간단한 테스트의 경우 위의 변경으로 충분하며 이제 테스트를 통과합니다. 그러나 Instancio는 생성된 개체를 사용자 지정하기 위한 여러 다른 기능을 지원합니다. 예를 들면 다음과 같습니다.

Instancio.of(BookDTO.class)
    .generate(field("genre"), gen -> gen.oneOf(Genre.CRIME, Genre.SCIFI, Genre.FANTASY))
    .generate(field("isbn"), gen -> gen.text().pattern("#d-#d#d#d#d#d-#d#d#d-#d"))
    .generate(field("numberOfPages"), gen -> gen.ints().range(100, 999))
    .create();


더 자세히 설명하는 후속 기사가 있을 수 있습니다. 더 많은 예제를 보고 싶거나 질문이 있는 경우 의견을 남겨주세요. 모든 피드백을 환영합니다!

자세한 내용을 알아보려면 여러 예제가 있는 user guide을 참조하십시오.
book-mapper-sample 프로젝트는 https://github.com/instancio/instancio-samples에서 찾을 수 있습니다.

연결


  • https://github.com/instancio/instancio
  • https://www.instancio.org
  • 좋은 웹페이지 즐겨찾기