LocalStack представляет собой локальную среду для эмуляции облачных сервисов AWS. Он позволяет тестировать интеграцию веб-приложений с такими сервисами, как S3, DynamoDB, SQS, Lambda, без необходимости подключения к реальной облачной инфраструктуре. Для тестирования с WebdriverIO LocalStack особенно полезен, когда необходимо проверить функциональность, зависящую от взаимодействия с облачными ресурсами, напрямую из автоматизированных сценариев.
LocalStack можно установить через pip или Docker. На
практике чаще используется Docker-образ, так как он обеспечивает
изоляцию и простоту запуска:
docker pull localstack/localstack
docker run -d -p 4566:4566 -p 4571:4571 --name localstack localstack/localstack
После запуска можно проверить статус сервисов:
docker logs -f 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';
Эти переменные обеспечивают корректное подключение к локально эмулируемым сервисам.
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, обеспечивая тестирование интеграции на фронтенде и бэкенде одновременно.
Для тестирования асинхронных процессов полезны 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 теста с проверкой 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 предоставляет встроенный веб-интерфейс для мониторинга
сервисов. Он доступен по адресу
http://localhost:4566/_localstack/health. Важно отслеживать
статус сервисов перед запуском тестов, чтобы избежать ошибок
подключения.
–docker и –detached.deleteBucket, purgeQueue) для предотвращения
накопления данных.LocalStack в связке с WebdriverIO позволяет строить комплексные тестовые сценарии с локальной эмуляцией облачной инфраструктуры, ускоряя разработку и снижая зависимость от внешних сервисов.