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 를 이용하여 테스트를 수행하는 것을 의미합니다.
테스트 흐름
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
에서 지정한 클래스들에 대한 구성을 자동화합니다.