Cron을 어떻게 테스트할 수 있을까?

Alex·2024년 11월 29일
0

Plaything

목록 보기
37/118

이번에 Cron으로 메모리 데이터를 지워주는 작업을 스케쥴링한다.

채팅메시지에 대해서 rate limit 기능을 구현할 때
각 유저마다 1초에 몇개의 메시지를 보냈는지를 map에 담아서 확인한다.

사실 이것만으로 메모리를 많이 차지하지는 않을 거 같지만
그래도 며칠간 로그인을 안한 유저 정보를 map에 계속 담고 있는 건 비효율적이라고 생각했다.

그래서 매일 새벽 3시에 map에 담긴 정보를 다 지워주는 스케쥴링 기능을 만들었다.

다만, cron 테스트는 30초 간격으로 실행되는 것처럼 짧은 간격의 경우만 테스트가 가능했다. 실제로 테스트 스레드를 30초 정도 멈추게 하고서, 스케쥴 메서드가 작동하는지 테스트하는 방식이다.

그래서 새벽 3시 스케쥴링처럼
특정 시간대에 스케쥴링을 돌리는 경우 테스트를 할 방법이 없었다.

테스트에서만 스케쥴 시간대를 변경하자

참고:Spring Scheduler 테스트 하기 이 글을 참고해서 테스트를 해본다.

crone 설정값을 appliction.properties를 통해서 넣어준다.

테스트용에서 appliction.properties를 변경해서, 스케쥴링이 실제로 작동하는지를 확인해보자.

schedules.cron.data.cleanup=0/2 * * * * ? 를 넣으면 2초마다 진행하도록 변경할 수 있다.

    @DisplayName("유저의 채팅 rate를 저장한 내역을 지우는 api를 스케쥴링한다")
    @Test
    void test3() {
        // 테스트 데이터 추가
        chatRateLimiter.checkRate("testUser");

        // 스케줄러 실행 대기 및 검증
        Awaitility.await()
                .atMost(3, TimeUnit.SECONDS)
                .untilAsserted(() -> {
                    assertThat(chatRateLimiter.isEmpty()).isTrue();
                });
    }
    

이렇게 테스트를 해주면 스케쥴링이 2초마다 돌아가는지 확인할 수 있다.

profile
답을 찾기 위해서 노력하는 사람

0개의 댓글