레디스를 TestContainers에 넣기

Alex·2024년 11월 21일
0

Plaything

목록 보기
23/118

로컬레디스를 쓰면서 테스트를 하니까
트랜잭션 롤백이 되지 않아서 자꾸 테스트간에 간섭이 있었다.

이에 임베디드 레디스와 테스트 컨테이너 두가지 방법을 알게 됐다. 임베디드 버전은 업데이트가 너무 오랫동안 안됐다고 한다.

테스트 컨테이너를 사용하면 실제 환경과 유사하게 테스트를 할 수 있다고 하기에 이를 사용해보기로 했다.

  testImplementation "org.junit.jupiter:junit-jupiter:5.8.1"
    testImplementation "org.testcontainers:testcontainers:1.17.6"
    testImplementation "org.testcontainers:junit-jupiter:1.17.6"

의존성을 추가해준다.

public class TestRedisConfig implements BeforeAllCallback {

    private static final String REDIS_IMAGE = "redis:7.0.8-alpine";
    private static final int REDIS_PORT = 6379;
    private GenericContainer redis;

    @Override
    public void beforeAll(ExtensionContext extensionContext) throws Exception {
        redis = new GenericContainer(DockerImageName.parse(REDIS_IMAGE))
                .withExposedPorts(REDIS_PORT);
        redis.start();
        System.setProperty("spring.data.redis.host", redis.getHost());
        System.setProperty("spring.data.redis.port", String.valueOf(redis.getMappedPort(REDIS_PORT
        )));
    }
}

대신 이 방식을 쓰려면 도커를 켜야 한다.

또한, 테스트 간 여전히 격리가 안돼서

이처럼 컨테이너를 매번 삭제해주어야 한다.

Unable to connect to localhost/<unresolved>:6379
io.lettuce.core.RedisConnectionException: Unable to connect to localhost/<unresolved>:6379
	at app//io.lettuce.core.RedisConnectionException.create(RedisConnectionException.java:78)

계속 이런 에러가 떴다.

PointKeyFacadeTest하나만 돌리면 테스트들이 성공하는데
전체를 돌리면 자꾸 실패했다.

왜 그런지 찾아보니
사용하는 레디스가 달라서 그런듯하다.
테스트에서 모두 동일한 테스트용 레디스를 사용하도록 변경해야 했다.

계속 안 돼서 이것저것 변경해보니

@TestConfiguration
public class TestRedisConfig {

    private static final String REDIS_IMAGE = "redis:5.0.3-alpine";
    private static final int REDIS_PORT = 6379;

    @Container
    private static final GenericContainer<?> redis = new GenericContainer<>(DockerImageName.parse("redis:5.0.3-alpine"))
            .withExposedPorts(6379);

    @Bean
    public LettuceConnectionFactory redisConnectionFactory() {
        redis.start();
        return new LettuceConnectionFactory(
                new RedisStandaloneConfiguration(
                        redis.getHost(),
                        redis.getMappedPort(6379)
                )
        );
    }
}


@Import(TestRedisConfig.class)
@SpringBootTest
class ApiApplicationTests {

    @Test
    void contextLoads() {
    }

이런식으로 import를 해줘야 했다.

커넥션이 부족하다?

갑자기 이제는 또 커넥션이 부족하다는 예외가 떴다..ㅎㅎ...(난리난리)

set global max_connections=500;

이렇게 수를 늘린다.

지금은 최대 연결수가 40으로 이를 10으로 줄여야 했다.

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

0개의 댓글