Рубрики
Без рубрики

Тестирование Amazon S3 с использованием s3 Ninja

Введение AWS в настоящее время является распространенным сервисом, используемым во многих веб-приложениях и используемым для загрузки файлов… С тегами aws, java, тестирование, docker.

Вступление

AWS в настоящее время является распространенной услугой, используемой во многих веб-приложениях, используемой для загрузки файлов, хранения, реестров контейнеров, хостинга, в качестве платформы container orchestrator и многого другого.

По мере роста его использования у разработчиков также возникают все более высокие потребности в тестировании интеграции таких сложных сервисов со своими приложениями, и это может быть непростой задачей, поскольку эти сервисы требуют большой настройки и сами по себе очень сложны.

Благодаря росту контейнеризации и популярности docker мы также наблюдаем тенденцию, когда сообщество предоставляет и поддерживает образы docker, которые облегчают работу разработчиков, которым необходимо протестировать интеграцию своих прикладных сервисов с сервисами AWS.

Мы рассмотрим одно из самых популярных изображений, scireum/s3-ninja , как мы можем его настроить и как настроить простой IT для одной из служб в нашем приложении, которая зависит от Amazon S3.

Основы S3 Ninja

После запуска образа docker вот что мы видим:

Как указано на изображении выше:

S3 ninja эмулирует S3 API для целей разработки и тестирования. Однако он не предназначен для использования в качестве производственной системы, поскольку не обеспечивает ни масштабируемости, ни репликации, ни надлежащей безопасности.

Доступ к запущенному контейнеру в веб-браузере, и если мы перейдем, например, к http://localhost:32782/ui/api мы можем видеть поддерживаемый API и какие методы мы можем протестировать.

Пока контейнер запущен, мы можем программно настроить со стороны Java “макет клиента AmazonS3”, предоставив URL-адрес запущенного контейнера, и затем мы можем использовать этот макет клиента для выполнения нашего интеграционного тестирования.

Настройка макета S3 ninja

Чтобы настроить макет клиента, нам нужно развернуть контейнер docker, содержащий образ S3 Ninja, а затем использовать его для настройки клиента:

@Testcontainers
@ExtendWith({SpringExtension.class, MockitoExtension.class})
@SpringBootTest
class TestingAServiceThatRequiresUsingAmazonS3Test {

//Container configuration using the Testcontainers dependency to manage docker containers from test contexts
    @Container
    private static GenericContainer s3Ninja = new GenericContainer<>("scireum/s3ninja").withExposedPorts(9444);

(...)

private void setupAmazonS3ninja(String bucketName) {
        final AmazonS3 httpAmazonS3 = AmazonS3ClientBuilder.standard()
            .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(
                "http://" + s3Ninja.getContainerIpAddress() + ":" + s3Ninja.getMappedPort(9444) + "/",
                Region.EU_North_1.getFirstRegionId()
            )).build();

//Inject s3Ninja into the service for testing purposes  
  someServiceThatRequiresUsingS3.setupAmazonS3client(httpAmazonS3);
    }

Вышеприведенный базовый каркас использует Тестовые контейнеры зависимость maven, которая автоматически управляет контейнерами docker для использования из тестового контекста, и ниже мы вызываем открытый метод из нашей управляемой службы Spring, единственной целью которой является “внедрение” макетного клиента в службу.

Здесь он передается с помощью явного метода, а не с использованием, например, инъекции конструктора, поскольку mockS3client является обычной зависимостью, не управляемой Spring. Используя подобный метод, мы можем выбирать между использованием реальных клиентов или имитированных клиентов из тестового контекста, сохраняя при этом гибкость для его параметризации для производственного использования.

С помощью этой простой настройки теперь мы можем написать настоящий тест.

Написание теста

Используя вышеупомянутый каркас, написание теста становится очень простым:

@Test
    void correct_setup_returns_good_response_from_service() {
        setupAmazonS3ninja("mytestBucketName");

        Optionalresponse = someServiceThatRequiresUsingS3.callAmethodThatUsesS3ClientInternally();

        assertTrue(response.isPresent());
    }

Как мы видим, как только мы настроим mockS3client из запущенного контейнера docker, теперь мы можем эффективно модульно протестировать наш метод обслуживания на фиксированном клиенте s3, который позволяет нам протестировать именно ту бизнес-логику, которая нам нужна.

Вывод

В этом посте описывается один из возможных подходов к созданию базовой конфигурации для тестирования сервисов, которые полагаются на Amazon S3, с помощью S3 Ninja.

Спасибо за чтение!

Оригинал: “https://dev.to/brunooliveira/testing-amazon-s3-using-s3ninja-1a4p”