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 라이브러리
위와 같은 번거로운 일을 줄이기 위해 개발자들은 또 열심히 노력해서 이런 상황을 해결할 수 있는 다음의 라이브러리들을 만들었습니다!
- Java Faker
- Fixture Monkey
- Just Do It
1. Data(or Kotlin) Faker
Data Faker는 객체에 랜덤한 값을 지정해주는 함수를 제공하는 라이브러리입니다.
환경구성
build.gradle
implementation 'net.datafaker:datafaker:1.8.1'
메소드 호출
Faker 객체 생성 후 아래와 같이 테스트 데이터를 생성하면 됩니다


한글 등 다른 locale의 테스트 데이터가 필요한 경우 생성자에 Locale 이름을 추가해주면 됩니다
Faker faker = new Faker(new Locale("ko"));
JSON
expression() 메서드를 통해 표현식을 사용하면 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-jackson (공식): 테스트에서 jackson을 통한 객체 직렬화/역직렬화를 지원합니다.
- fixture-monkey-kotlin (공식): 코틀린 지원
- fixture-monkey-javax-validation : JSR380: Bean Validation 2.0 annotation을 활용해 객체의 값을 제어할 수 있도록 플러그인을 지원합니다.
- fixture-monkey-autoparams (베타 버전): 다른 PBT 오픈소스인 AutoParams 과의 연동을 지원합니다.
- fixture-monkey-mockito (베타 버전): 모킹 도구인 mockito의 목 객체 생성/인터페이스를 지원합니다.
사용법
Fixture Monkey는 의존성을 추가하고 Setter만 추가해주면 바로 사용이 가능합니다.
- FixtureMonkey.create()를 통해 손쉽게 데이터 빌더를 생성하고 이를 이용해 데이터를 생성합니다

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


자세한 사용법
생성 전략
생성 전략은 여러가지가 존재하는데요, 기본적인 생성 전략은 BeanArbiyraryGenerator 로 자바빈즈 규칙에 따라 Setter로 생성합니다.
BeanArbitraryIntrospector
필요조건
- 클래스가 파라미터가 없는 빈 생성자를 가지고 있습니다.
- 클래스에 세터가 존재합니다
특별한 설정이 필요하다면 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



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


@BeforeEach를 통한 테스트 데이터를 세팅하는 코드가 없어, 테스트 작성에만 신경 쓸 수 있고 가독성도 향상되어 보기에 매우 깔끔합니다!
하지만 결국 데이터를 직접적으로 넣어주게 되는 것은 동일하므로 번거로울 수 있지만, 한 번 선언해두면 다른 테스트에서 호출하여 재사용할 수 있습니다
'Java' 카테고리의 다른 글
추상클래스 무엇이고, 왜, 어떻게 사용할까? (0) | 2023.03.24 |
---|---|
스레드(Thread) - 개념, 동시성 (0) | 2022.11.29 |
[Java] 가비지 컬렉션 (Garbage Collection GC) (0) | 2022.08.13 |
추상 클래스 vs 인터페이스 (0) | 2022.04.12 |