Localstack + Testcontainers로 S3업로드 테스트코드 작성예제

TreeSick·2022년 6월 10일
0

테스트코드

목록 보기
1/2

저번 예제에서는 로컬에서 직접 AWS계정에 있는 S3에 연결을 해보았습니다.

하지만, 프로젝트 실행 전에 테스트 코드를 통해 검증을 하는 것이 필수가 되었습니다.

테스트 코드에서는 AWS에 어떻게 연결을 시켜줘야 할까요?

이때 사용되는 것이 Localstack입니다.

자바 언어로 버킷을 실행시킬 수 있는 라이브러리 testcontainers와 결합해서 테스트 코드를 작성해보겠습니다.

LocalStack/Testcontainers 기본 개념

깃헙에 있는 정리본을 참고해주세요!

https://github.com/namusik/TIL-SampleProject/blob/main/TestCode/Testcontainers/Testcontainers%20%EA%B0%9C%EB%85%90.md

소스코드

https://github.com/namusik/TIL-SampleProject/tree/main/TestCode/LoaclStack/LocalStack%20%EC%98%88%EC%A0%9C

작업환경

IntelliJ
Spring Boot
java 11
gradle

build.gradle

dependencies {
    //testcontainer
    testImplementation 'org.testcontainers:junit-jupiter'
    //localstack
    testImplementation 'org.testcontainers:localstack'
    //s3
    implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'
}

각각, testcontainer, localstack, aws cloud 의존성을 추가해줍니다.

LocalStackTestcontainerTest

@Testcontainers
@DisplayName("s3")
public class LocalStackTestcontainerTest {
    //docker 이미지 명
    private static final DockerImageName LOCALSTACK_NAME = DockerImageName.parse("localstack/localstack");

    //localstackcontainer를 해당 docker 이미지로 s3 서비스 실행
    @Rule
    public LocalStackContainer localStackContainer = new LocalStackContainer(LOCALSTACK_NAME).withServices(S3);

    @Test
    @DisplayName("s3 업로드 테스트")
    public void test() throws IOException {
        //localstack 컨테이너로 AmazonS3 설정 값에 추가.
        AmazonS3 amazonS3 = AmazonS3ClientBuilder.standard()
                            .withEndpointConfiguration(localStackContainer.getEndpointConfiguration(S3))
                            .withCredentials(localStackContainer.getDefaultCredentialsProvider())
                            .build();

        //S3 인스턴스로 버킷 생성 및 put, get test
        String bucketName = "woo";
        amazonS3.createBucket(bucketName);
        System.out.println("버킷 생성");

        String key = "aaaa";
        String content = "bbbbb";
        amazonS3.putObject(bucketName, key, content);
        System.out.println("파일 업로드");

        S3Object object = amazonS3.getObject(bucketName, key);
        System.out.println("object.getKey() = " + object.getKey());
        String key2 = object.getKey();
        String content2 = IOUtils.toString(object.getObjectContent(), Charset.forName("UTF-8"));

        assertAll(
                () -> assertEquals(content, content2),
                () -> assertEquals(key, key2)
        );
    }
}

테스트 코드.

@Testconainers

먼저, testcontainer를 쓰기 위해 전체 클래스에 해당 어노테이션을 적어줍니다.

private static final DockerImageName LOCALSTACK_NAME = DockerImageName.parse("localstack/localstack");

도커에서 localstack/localstack 이미지를 가져옵니다.

@Rule
public LocalStackContainer localStackContainer = new LocalStackContainer(LOCALSTACK_NAME).withServices(S3);

가져온 이미지명과 사용하려는 AWS 서비스 (여기선 s3)를 가지고 localstackcontainer를 도커에 만들어 줍니다.

이 과정까지 진행되면 현재 도커에 컨테이너가 돌아가게 됩니다.

이 다음으로 AmazonS3 객체를 만들어 줍니다.

.withCredentials(localStackContainer.getDefaultCredentialsProvider())

여기서 별도의 aws 시크릿키가 없기 때문에, localstack의 defaultcredential을 사용해줍니다.

amazonS3.createBucket(bucketName);

그리고 각자 원하시는 버킷이름을 지정하여 버킷을 만들어 준후,

amazonS3.putObject(bucketName, key, content);

object를 업로드 해줍니다.

assertAll(
() -> assertEquals(content, content2),
() -> assertEquals(key, key2)
);

오브젝트를 만들 때의 값과, 버킷에서 가져왔을 때의 값을 비교했을 때, 일치하면 테스트 통과입니다.

도커 생성 결과

테스트 도중 도커를 확인해보면, testcontainer와 localstack 컨테이너가 만들어 진것이 확인 가능합니다.

참고

https://www.testcontainers.org/modules/localstack/

https://techblog.woowahan.com/2638/

https://loosie.tistory.com/817

https://docs.localstack.cloud/aws/s3/

profile
깃헙에 올린 예제 코드의 설명을 적어놓는 블로그

0개의 댓글