[공부정리] Spring Batch 5 에서 통합 테스트 코드 작성

jeyong·2024년 6월 4일
0

공부 / 생각 정리  

목록 보기
80/121


최근 Spring Batch 5로 버전이 올라가면서 많은 변화가 생기게 되었다. Spring Batch 5에서 테스트 코드를 작성하고자 하는 사람에게 도움이 되면 좋겠다는 마음에 이번 게시글에서는 Spring Batch 5 에서 Job에 대한 테스트 코드를 작성한 내용에 대해서 기술하겠다.

1. yml 파일 작성

spring:
  h2:
    console:
      enabled: true # /h2-console 설정
  datasource:
    meta:
      hikari:
        driver-class-name: org.h2.Driver
        jdbc-url: jdbc:h2:mem:meta
        username: sa
        password:

    domain:
      hikari:
        driver-class-name: org.h2.Driver
        jdbc-url: jdbc:h2:mem:domain
        username: sa
        password:
        auto-commit: false
        
  batch:
    job:
      enabled: false
    jdbc:
      initialize-schema: always

  jpa:
    properties:
      hibernate:
        format_sql: true            # SQL 보기 좋게 출력
        highlight_sql: true         # SQL 색깔
        hbm2ddl.auto: create-drop
        default_batch_fetch_size: 100
    open-in-view: false
    show-sql: true

위 설정 파일은 테스트 환경에서 H2 데이터베이스를 사용하도록 구성되어 있으며, Spring Batch와 JPA의 기본 설정을 포함하고 있다.

@Profile("test")
    @Bean
    public DataSourceInitializer metaDataSourceInitializer() {
        DataSourceInitializer dataSourceInitializer = new DataSourceInitializer();
        dataSourceInitializer.setDataSource(metaDataSource());
        ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator();
        databasePopulator.addScript(new ClassPathResource("sql/batch-postgresql.sql"));
        dataSourceInitializer.setDatabasePopulator(databasePopulator);
        return dataSourceInitializer;
    }

@EnableBatchProcessing 또는 DefaultBatchConfiguration를 사용하여 Batch 설정을 커스텀할 경우에는 pring Batch의 자동 설정이 적용되지 않는다. 그래서 테스트 환경에서 메타 데이터베이스를 초기화하기 위한 DataSourceInitializer 빈을 설정한다.

2. 테스트 코드 작성

@ActiveProfiles(value = "test")
@SpringBatchTest
@SpringBootTest
public class PaymentExecutionJobTest {

    @Autowired
    JobLauncherTestUtils jobLauncherTestUtils;
    @Autowired
    @Qualifier(PAYMENT_JOB)
    Job paymentExecutionJob;
    
    @BeforeEach
    void beforeEach() {
        jobLauncherTestUtils.setJob(paymentExecutionJob);
    }

    @Test
    public void paymentExecutionJobTest() throws Exception {
        // given
        JobParameters jobParameters = buildJobParameters();
        
        // when
        JobExecution jobExecution = jobLauncherTestUtils.launchJob(jobParameters);
        StepExecution stepExecution = jobExecution.getStepExecutions().iterator().next();
       
        // then
        TODO. 검증 로직
    }
  • 많은 게시글에서 @SpringBootTest(classes = Job을 정의한 클래스)를 사용하지만, @Qualifier를 이용하여 Job을 주입받은 뒤, jobLauncherTestUtils.setJob(원하는 Job)을 이용하여 jobLauncherTestUtils에서 launchJob을 할 수 있도록 하는 것이 더 간단하다고 생각하여 @Qualifier를 이용하도록 구현하였다.
  • 해당 방식을 사용하면 많은 Job들을 다른 클래스로 분리할 필요 없이 하나의 클래스에 모아두어도 된다는 장점이 있다.

3. 테스트 결과

적절하게 구현한다면 테스트 코드는 문제없이 작동할 것이다. 참고로 테스트 내용은 아래와 같다.

  • DeletionExecutionJobTest: 회원 탈퇴 결제 Job 테스트
  • BatchControllerTest: 재결제 Controller 테스트
  • AutomaticPaymentExecutionJobTest: 정기 결제 Job 테스트
  • PaymentExecutionJobTest: 결제 Job 테스트

이러한 방식으로 Spring Batch 5 환경에서 테스트 코드를 작성하면 효율적이고 일관된 테스트를 수행할 수 있다.

profile
노를 젓다 보면 언젠가는 물이 들어오겠지.

0개의 댓글