LocalStack сервис

LocalStack представляет собой локальную среду для эмуляции облачных сервисов AWS. Он позволяет тестировать интеграцию веб-приложений с такими сервисами, как S3, DynamoDB, SQS, Lambda, без необходимости подключения к реальной облачной инфраструктуре. Для тестирования с WebdriverIO LocalStack особенно полезен, когда необходимо проверить функциональность, зависящую от взаимодействия с облачными ресурсами, напрямую из автоматизированных сценариев.

Установка LocalStack

LocalStack можно установить через pip или Docker. На практике чаще используется Docker-образ, так как он обеспечивает изоляцию и простоту запуска:

docker pull localstack/localstack
docker run -d -p 4566:4566 -p 4571:4571 --name localstack localstack/localstack
  • Порт 4566 — основной для взаимодействия с сервисами AWS в LocalStack.
  • Порт 4571 — используется для UI LocalStack (по умолчанию).

После запуска можно проверить статус сервисов:

docker logs -f localstack

Конфигурация WebdriverIO для работы с LocalStack

WebdriverIO используется для автоматизации тестов пользовательского интерфейса, а LocalStack обеспечивает локальные сервисы для бэкенд-тестирования. Чтобы интегрировать их, потребуется настроить WebdriverIO с правильными параметрами окружения для AWS SDK:

process.env.AWS_ACCESS_KEY_ID = 'test';
process.env.AWS_SECRET_ACCESS_KEY = 'test';
process.env.AWS_REGION = 'us-east-1';
process.env.AWS_ENDPOINT = 'http://localhost:4566';

Эти переменные обеспечивают корректное подключение к локально эмулируемым сервисам.

Использование LocalStack с S3

S3 — один из самых часто используемых сервисов. В тестах WebdriverIO можно проверять загрузку файлов через интерфейс, одновременно проверяя их наличие в S3, эмулированном LocalStack.

Пример создания бакета и загрузки файла с использованием AWS SDK:

const AWS = require('aws-sdk');
const s3 = new AWS.S3({ endpoint: process.env.AWS_ENDPOINT });

async function createBucketAndUpload() {
    await s3.createBucket({ Bucket: 'test-bucket' }).promise();

    await s3.putObject({
        Bucket: 'test-bucket',
        Key: 'sample.txt',
        Body: 'Пример содержимого файла'
    }).promise();

    const result = await s3.getObject({ Bucket: 'test-bucket', Key: 'sample.txt' }).promise();
    console.log(result.Body.toString()); // "Пример содержимого файла"
}

В WebdriverIO можно автоматизировать загрузку файла через UI и сразу проверять его наличие в бакете LocalStack, обеспечивая тестирование интеграции на фронтенде и бэкенде одновременно.

Использование LocalStack с SQS и Lambda

Для тестирования асинхронных процессов полезны SQS и Lambda. LocalStack позволяет создавать очереди и триггеры локально, что ускоряет цикл тестирования.

Пример создания очереди и отправки сообщения:

const sqs = new AWS.SQS({ endpoint: process.env.AWS_ENDPOINT });

async function createQueueAndSendMessage() {
    const { QueueUrl } = await sqs.createQueue({ QueueName: 'test-queue' }).promise();

    await sqs.sendMessage({
        QueueUrl,
        MessageBody: 'Тестовое сообщение'
    }).promise();

    const messages = await sqs.receiveMessage({ QueueUrl }).promise();
    console.log(messages.Messages[0].Body); // "Тестовое сообщение"
}

Lambda-функции можно эмулировать через LocalStack и связывать с очередями SQS, проверяя реакцию системы на события.

Интеграция с WebdriverIO

Сценарий теста может включать следующие шаги:

  1. Эмуляция загрузки файла через интерфейс приложения.
  2. Проверка его наличия в локальном S3 через AWS SDK.
  3. Отправка события в SQS и проверка обработки Lambda-функцией.

Пример WebdriverIO теста с проверкой S3:

describe('Загрузка файла и проверка S3', () => {
    it('Файл должен быть загружен и сохранен в S3', async () => {
        await browser.url('/upload');
        const uploadInput = await $('#file-upload');
        await uploadInput.setValue('/path/to/sample.txt');
        await $('#submit').click();

        const s3Object = await s3.getObject({
            Bucket: 'test-bucket',
            Key: 'sample.txt'
        }).promise();

        expect(s3Object.Body.toString()).toBe('Пример содержимого файла');
    });
});

Отладка и мониторинг LocalStack

LocalStack предоставляет встроенный веб-интерфейс для мониторинга сервисов. Он доступен по адресу http://localhost:4566/_localstack/health. Важно отслеживать статус сервисов перед запуском тестов, чтобы избежать ошибок подключения.

Рекомендации по использованию

  • Для ускорения тестов можно запускать LocalStack в режиме –docker и –detached.
  • Использовать отдельные бакеты и очереди для каждого теста, чтобы избежать конфликтов и сохранить идемпотентность.
  • Регулярно очищать LocalStack после тестов через API (deleteBucket, purgeQueue) для предотвращения накопления данных.
  • Совмещать WebdriverIO и LocalStack для интеграционного тестирования, особенно когда необходимо проверять взаимодействие фронтенда с бэкенд-сервисами AWS.

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