테스트 데이터 생성 시
단위 테스트를 작성할 때, 테스트마다 필요한 데이터를 생성하는 코드를 반복적으로 생성해야하는 경우가 많다.
예를 들어, 여러 테스트에서 User가 필요하다면 해당하는 테스트 데이터가 필요한 테스트마다 매번 User 엔티티를 생성해야 하는 경우가 많았다. 이러한 반복되는 코드는 가독성을 떨어뜨리기 때문에, 이를 재사용할 수 있다면 반복되는 코드를 제거하고 유지보수성이 좋은 코드가 될 수 있을 것이다.
Test Fixture란?
테스트 픽스처는 소프트웨어 테스트에서 특정 테스트를 실행하기 전에 준비되어야 하는 고정된 상태의 환경을 의미한다.
public enum UserFixture {
USER("user@gmail.com", "password1!", "userNickname", 0L, Role.ASSOCIATE, false),
ANOTHER_USER("user@gmail.com", "password1!", "anotherUserNickname", 0L, Role.ASSOCIATE, false),
SELLER("seller@gmail.com", "password1!", "sellerNickname", 1000L, Role.ASSOCIATE, false),
BUYER("buyer@gmail.com", "password1!", "buyerNickname", 1000L, Role.ASSOCIATE, false),
;
private final String username;
private final String password;
private final String nickname;
private final Long account;
private final Role role;
private final Boolean isDeleted;
UserFixture(String username, String password, String nickname, Long account, Role role,
Boolean isDeleted) {
this.username = username;
this.password = password;
this.nickname = nickname;
this.account = account;
this.role = role;
this.isDeleted = isDeleted;
}
public User getUser() {
return User.builder()
.username(username)
.password(password)
.nickname(nickname)
.account(account)
.role(role)
.isDeleted(isDeleted)
.build();
}
}
멀티 모듈에서 fixture 사용하기
🌱 문제 상황
현재 프로젝트에서는 Controller, UseCase는 app 모듈과 admin 모듈, Entity와 Repository는 domain 모듈에서 관리하고 있다.
따라서 엔티티를 반환하는 fixture 클래스를 domain 모듈에서 관리할 경우, 위처럼 app 모듈과 admin 모듈에서 domain 모듈에 있는 fixture를 불러올 수 없는 문제가 있다.
🌱 문제 발생 이유
멀티 모듈 프로젝트에서 각 모듈은 독립적으로 빌드되고 패키징되어 JAR 파일로 만들어지고, 다른 모듈은 이러한 JAR 파일을 의존성으로 사용하여 기능을 확장하거나 통합한다. 이 때 빌드된 JAR 파일에는 테스트와 관련된 파일이 포함되지 않기 때문에 다른 모듈의 test 하위에 있는 클래스를 사용할 수 없는 것이다.
🌱 해결 방안
- 필요한 Fixture 클래스를 모든 모듈에 작성한다
→ 코드 중복 발생. 변경 사항 발생 시 각각 수정해주어야 해 관리의 어려움 유발 - Fixture 클래스를 모아두는 테스트 전용 모듈을 만든다
→ 실제 애플리케이션 코드와 테스트용 Fixture 코드가 서로 다른 모듈에 위치하게 되어 응집도 저하
이를 해결하기 위해 Gradle의 java-test-fixtures 플러그인을 사용할 수 있다.
plugins {
id 'java'
id 'java-test-fixtures'
}
dependencies {
...
// Jakarta Persistence API 의존성 추가
testFixturesImplementation 'jakarta.persistence:jakarta.persistence-api:3.0.0'
}
Fixture 클래스가 위치할 모듈(나의 경우 domain 모듈)에 위 플러그인을 추가하면 domain/src 하위에 testFixtures 디렉토리를 생성할 수 있게 된다.
dependencies {
...
testImplementation(testFixtures(project(':chaewsstore-core:domain')))
}
그 후 Fixture 클래스를 사용할 모듈(나의 경우 app과 admin 모듈)의 build.gradle에 위 의존성을 추가해주면 domain 모듈의 Fixture 클래스를 해당 모듈에서 사용할 수 있는 것을 확인할 수 있다.
'Back-end' 카테고리의 다른 글
[Spring] SonarQube로 프로젝트 정적 코드 분석 (0) | 2024.08.19 |
---|---|
[Spring Boot] 로컬 환경에서 Github Actions 테스트하기 (0) | 2024.08.16 |
[Gradle] build.gradle 플러그인 분리하기 (0) | 2024.07.25 |
[Spring Boot] 멀티모듈에 JaCoCo + JaCoCo Report Aggregation 적용하기 (3) | 2024.07.25 |
Jmeter를 사용한 동시성 테스트 (0) | 2024.07.05 |