DataSource PostgreSQL JPA Repository 테스트 작성 가이드 - dpTablo/spring-boot-template-reactive GitHub Wiki

프로젝트의 DataSource 기반의 Repository 에 대한 테스트 환경에 대하여 설명합니다.

R2dbc Repository 테스트는 아래 테스트 프레임워크의 의존성이 있습니다.

  • testcontainers
  • flyway

추가적으로 자체 구현한 DataSourcePostgresTestSupportExtension 등의 클래스를 이용하여 테스트를 수행합니다.

이 문서는 Datasource, JDBC 와 postgreSQL DBMS 를 사용하는 것에 대한 내용을 다루지만 다른 관계형 DBMS 또는 mongodb 와 같은 NoSQL DB인 경우에도 전체적인 테스트를 수행하는 과정은 비슷합니다. testcontainers와 flyway 를 이용하여 테스트를 수행하는 것을 의미합니다.

테스트 흐름

1

application-tc.yml

src/test/resources 경로에 application-tc.yml 설정파일이 있습니다. spring profile 명이 ‘tc’ 인 경우에는 testcontainers 를 이용한 테스트 환경에 필요한 설정을 지정합니다.

해당 파일에 테스트에 필요한 r2dbc, flyway, logback 설정 등 필요한 설정항목을 지정하여 사용합니다.

테스트 DB 설정

src/test/java 하위에 클래스 속성을 변경하여 테스트 대상 PostgreSQL에 대해 설정합니다.

  • com.dptablo.template.springboot.test.support.settings.TestContainersPostgresDatabaseSettings

예제코드와 설명

@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@ActiveProfiles("tc")
@Testcontainers
@ExtendWith(DataSourcePostgresTestSupportExtension.class)
@ContextConfiguration(classes = {
        FlywayConfiguration.class,
        JpaConfiguration.class,
        UserRepository.class,
        UserRoleRepository.class,
        User.class,
        UserRole.class
})
@EnableAutoConfiguration
class UserRepositoryTest {
    @Autowired
    private UserRepository userRepository;

    @Autowired
    private UserRoleRepository userRoleRepository;

    @DisplayName("entity 저장 후 조회 테스트")
    @Test
    void saveAndFind() {
			// TODO 테스트 코드..
		}
}

@DataJpaTest

JPA 구성 요소에 대한 테스트를 수행하기 위한 어노테이션입니다. 전체 자동 구성이 비활성화 되고 Data JPA 테스트와 관련된 구성만 적용됩니다.

@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)

@DataR2dbcTest 어노테이션에는 @AutoConfigureTestDatabase 어노테이션이 적용되어 있습니다. testcontainers 를 이용한 테스트 케이스는 docker 기반의 실제 DB에 접근하여 테스트를 수행하기 때문에 AutoConfigureTestDatabase.Replace.NONE 속성을 설정해야 DB 접근이 가능합니다.

@ActiveProfiles("tc")

profile을 ‘tc’ 로 지정하여 테스트를 수행합니다.

@TestContainers

이 어노테이션이 지정되면testcontainers 구성요소가 초기화 됩니다.

@ExtendWith(DataSourcePostgresTestSupportExtension.class)

테스트를 수행하는데 필요한 처리를 담당하는 extension 클래스인 DataSourcePostgresTestSupportExtension 을 적용합니다. 테스트 케이스를 수행할 때마다 실행해야 하는 코드의 자동화를 담당합니다.

@ContextConfiguration(classes = {FlywayConfiguration.class, JpaConfiguration.class, ‘테스트대상Repository’.class})

프로젝트 구성에 맞추어 FlywayConfiguration, JpaConfiguration클래스 (src/main/java 내의 @Configuration 클래스) 와 테스트 대상이 되는 Repository 구현 클래스를 지정해야 합니다. 위의 예제 코드에서는 UserRepository 를 테스트 하는 경우에 대한 코드 입니다.

@EnableAutoConfiguration

@ContextConfiguration 에서 지정한 클래스들에 대한 구성을 자동화합니다.