Spring boot and flyway: 통합 테스트 전에 데이터베이스 데이터 삭제
데이터베이스에서 통합 테스트를 실행하는 Spring boot framework(v2.0.2)를 사용하여 REST 서비스를 구축하고 있습니다.저는 많은 검색을 했고 시험 전에 데이터베이스를 청소하는 것에 대한 기사들이 많이 있지만, 안타깝게도 저는 그것들이 비효율적이거나 해킹이고 스프링 부트용이 아니라는 것을 알게 되었습니다.이 문제에 대한 좋은 방법을 제시해 주시겠습니까?
이상적으로는 데이터베이스를 각 테스트 전에 삭제하는 것이 아니라 그룹, 예를 들어 스위트 또는 각 테스트 클래스 앞에서 삭제해야 한다고 생각합니다.발견된 제안 중 하나는 다음과 같습니다.
@Autowired
protected Flyway flyway;
@Before
public void init() {
flyway.clean();
flyway.migrate();
}
각 테스트 전에 데이터베이스를 재구축하므로 효율적이지 않습니다.하고 사용하기@BeforeClass
스프링이 정적 필드를 주입하지 않기 때문에 작동하지 않습니다.
정적 맥락에서 이 플라이웨이빈에 도달하여 이 솔루션이 작동할 수 있도록 하는 좋은 방법이 있을까요?
여기에 있는 하위 질문:Flyway에는 clean 명령어가 있어 데이터를 지울 뿐만 아니라 모든 것을 삭제한 다음 migrate 명령어가 마이그레이션을 다시 수행합니다.이것은 또한 간접비처럼 보입니다.어쨌든 시작할 때 마이그레이션을 확인하기 때문에 각 테스트 그룹 전에 모든 것을 해체하고 재구축할 필요가 없다고 생각합니다.데이터를 삭제하는 것만으로도 충분합니다.이것이 어떻게 달성될 수 있는지 조언해 주시겠습니까?
요약하자면, 각 통합 테스트 그룹(예: 클래스당) 전에 데이터베이스 데이터를 제거하는 표준 방법(가능한 경우 테이블이 아닌)을 찾고 있습니다.Spring boot를 사용하는 동안 모든 사람이 이 작업에 직면할 것이라고 생각합니다. 따라서 프레임워크 자체에서 고려할 수 있는 좋은 솔루션이 있을 수 있습니다.
감사해요!
테스트를 위한 구성 파일을 만들 수 있습니다.모든 테스트 전에 한 번 실행됩니다.
@Configuration
public class TestConfig {
@Bean
public FlywayMigrationStrategy clean() {
return flyway -> {
flyway.clean();
flyway.migrate();
};
}
}
이 답변은 유용했지만 저를 거기까지 데려다 주지는 못했기 때문에 다른 사람이 이 같은 문제를 해결하려고 할 경우에 대비하여 제가 돌아와서 답변을 추가해야겠다고 생각했습니다.위의 콩의 정의는 훌륭했습니다.
스프링 프로파일에는 5가지 정도의 가능성이 있습니다.저는 문서와 사람들이 어떻게 사용하는지 살펴보았지만 다른 길로 갔습니다.메이븐에는 6개의 스코프가 있지만 이 경우에 유용한 스코프는 런타임 및 테스트입니다.
스프링 프로필과 그들 사이에서 전환할 수 있는 다양한 방법을 파고들면서 제 상황은 너무 복잡해 보였습니다.jpa spring boot app에서 저장소를 테스트할 수 있도록 테스트 대상 데이터베이스를 만들고, 구조화하고, 일부 데이터로 채워야 합니다.나는 프로필 설정에 4시간을 쓰고 싶지 않습니다.그것이 장기적으로 가치 있는 노력이 아니라는 것이 아니라, 단지 일을 진행시키고 싶었을 뿐입니다.
spring-boot:run을 실행할 때 비테스트 DB는 마이그레이션되지만 테스트에 사용하는 crud 데이터는 해당 데이터베이스에 포함되지 않습니다.
따라서 라이브 앱에서는 데이터베이스가 거의 비어 있고 테스트 중에는 DB를 정리하고 버전별 마이그레이션을 실행하며 테스트 데이터를 채울 수 있는 플라이웨이가 필요합니다.
위의 답변은 제 프로젝트가 생산에 가까워짐에 따라 스프링 프로파일로 접을 수 있는 솔루션으로 저를 이끌었습니다.
spring-boot-test는 src/test/계층의 모든 클래스에 연결할 수 있는 @TestConfiguration 주석을 제공하는 것으로 나타났습니다.위에 제공된 bean 정의를 포함하는 Flyway Configuration 클래스를 만들었습니다.
package com.foo.fooservice;
import org.flywaydb.core.Flyway;
import org.springframework.boot.autoconfigure.flyway.FlywayMigrationStrategy;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.context.annotation.Bean;
@TestConfiguration
public class FlywayMigrationConfig {
@Bean
public static FlywayMigrationStrategy cleanMigrateStrategy(){
return flyway -> {
flyway.clean();
flyway.migrate();
};
}
}
이제 테스트에 사용하려면 적절한 테스트 클래스에 @TestConfiguration 주석의 동반자인 @Includes(@TestConfiguration 주석 포함)에 다른 멋진 주석을 추가하여 @BeforeClass와 같은 방식으로 이 구성을 사용할 수 있습니다.
@DataJpaTest
@Import(FlywayMigrationConfig.class)
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class AccountUserRepoTest {
@Autowired
private AccountUserRepo accountUserRepo;
@Autowired
private FlywayMigrationStrategy strategy;
이를 통해 테스트 클래스별로 이 플라이웨이 마이그레이션 전략을 주입할 수 있습니다.Spring은 모든 테스트 클래스에 빈을 자동으로 주입하지 않으며, 이제 적절한 테스트 클래스에 @주석 포함을 추가하는 것만으로 이 구성을 사용할 수 있습니다.사용할 모든 테스트 클래스에서 빈을 정의할 필요는 없습니다.@Includes(@TestConfiguration-annoted-class)를 사용하면 됩니다.
나는 우연히 우편물을 사용하고 있습니다.H2가 아닌 SQL입니다. 저장소 엔티티에 대한 통합 테스트를 수행할 경우 운영 환경에서 사용할 통합 테스트를 수행할 수 있습니다.
또한 src/main/resources에는 jdbc 및 flyway 속성이 dev 스키마 이름과 jdbc URL로 설정되어 있습니다.
src/test/sys/application.properties는 스키마 이름을 'test'(원하는 이름으로 지정할 수 있음)로 설정합니다.
이 접근 방식의 한 가지 단점은 세분성입니다. DB는 이렇게 구성하는 모든 테스트 클래스에 대해 정리되고 다시 채워집니다.
테스트 중인 각 리포지토리 클래스에 대해 데이터를 새로 고치기를 원하기 때문에 개인적으로 이 작업을 좋아합니다.또한 특정 테스트 클래스에서 작업하는 경우 이 수준의 세분화된 구성을 사용하면 '테스트 실행'이 즉시 실행됩니다.IDE를 작동시키기 위해 IDE에 특별한 구성이 필요하지 않습니다.
언급URL : https://stackoverflow.com/questions/50915868/spring-boot-and-flyway-clear-database-data-before-integration-tests
'source' 카테고리의 다른 글
런타임에 Python 모듈 버전 확인 (0) | 2023.07.21 |
---|---|
열 유형을 지정하는 판다에 빈 데이터 프레임 만들기 (0) | 2023.07.21 |
kotlin slf4j를 사용하여 기록하는 가장 좋은 방법 (0) | 2023.07.21 |
Java 클래스 캐스트 예외 - 스프링 부트 (0) | 2023.07.21 |
Python: 일시적으로 압축을 풀지 않고 zip으로 파일 열기 (0) | 2023.07.21 |