Есть ли способ локализовать SNS для запуска модульных тестов? Я знаю, что dynamoDB может быть локально создан с использованием DynamoDBLocal, поддерживает SNS то же самое? Если да, может ли кто-нибудь предоставить документацию в состоянии сделать это? Спасибо заранее.
Как тестировать sns локально в среде IDE, например Intellij (для модульных тестов)
Ответ 1
Нет, в настоящее время AWS не предоставляет способ запуска SNS локально. Однако есть несколько способов, которыми разработчики могут тестировать наши приложения, чтобы обеспечить хорошее поведение при интеграции с внешними службами.
Вот три варианта, которые вы должны учитывать:
- Интеграционная учетная запись
- Дразнящий
- FakeSNS
Amazon не предоставляет зону песочницы для тестирования приложений. Однако нет ничего, что помешает нам регистрировать события на уровне интеграции.
В качестве примера зарегистрируйте тему в AWS под названием "NewAccountEvent-Dev" и предоставьте эту тему для тестирования интеграции. Это обеспечит правильное построение приложений для AWS. Обычно я ожидаю, что у большинства зрелых команд есть несколько полностью интегрированных тестовых сред. Попробуйте и убедитесь, что регионы до производства точно такие же, как и производство.
Как разработчики, мы должны постараться, чтобы мы как можно раньше подобрали проблемы. Решение проблем интеграции после развертывания приложения даже в тестовой среде довольно далеко в процессе разработки. Чтобы улучшить нашу интеграционную среду, мы можем использовать концепцию call mocks. Mocks позволит нам решать проблемы во время сборки.
Mocking позволяет вам проверить, будет ли приложение правильно отвечать на сообщения, которые вы ожидаете от SNS. Вы вручную настроите ответы и начнете писать свои тесты против поддельных служб SNS. Есть много насмешливых инструментов, которые помогут вам разоблачить макеты. Выбранный язык и ракурс в конечном итоге приведет к выбору рамки. Лично я больше всего знаком с Мокито, так как я использую его в весеннем ботинке.
Наконец, вы можете запустить приложение и включить службу, которая эмулирует SNS. Это похоже на DynamoDBLocal FakeSNS. Если вы пишете приложение, которое имеет большую интеграцию в SNS. т.е. удаление, создание, работа с разрешениями и т.д. Этот проект будет хорошим взглядом. Эти серверы богаче, поскольку они обычно реализуют логику внутри самой службы, а не просто издеваются над интерфейсом.
К сожалению, Fake SNS, похоже, не так много активности GitHub на данный момент; поэтому я бы посоветовал вам продолжать делать больше исследований.
Ответ 2
Еще одна хорошая ложная реализация SNS - LocalStack
Localstack предоставляет несколько поддельных реализаций сервисов amazon aws. Я использую его для тестирования полной связи sns/sqs локально и на CI. Работает отлично.
Ответ 3
К сожалению, там нет реализации SNS, которая выполняется локально. Поэтому вы должны выполнять макет тестов с помощью такой утилиты, как mockito.
Ответ 4
У нас есть обработчик notificationService, в котором все уведомления SNS отправляются, вызывая его в коде, как это.
await ApplicationService.notification.notify(NotificationType.EMAIL_UPSERTED, { id: user.id.toString() });
Это вызовет функцию уведомления уведомлений, которая в локальной среде немедленно выполнит уведомление, а не отправит SNS. Это отлично работает, чтобы убедиться, что фоновый код работает.
/**
* @description notify addressee
* @param {string} topic action or topic name
* @param {object} message sns message object
* @returns {Promise<void>}
* @memberof NotificationService
*/
public async processNotification(topic: string, message: any):Promise<boolean> {
Services.logger.debug('notification/notificationService.processNotification', { topic, message });
let status: boolean = false;
switch (topic) {
case NotificationType.EMAIL_UPSERTED:
// do something
break;
default:
break;
}
/**
* @description send a notification via sns
* @param {NotificationType} topic action or topic name
* @param {object} message sns message object
* @returns {Promise<void>}
* @memberof NotificationService
*/
public async notify(topic: NotificationType, message: any): Promise<void> {
Services.logger.debug('notification/notificationService.notify', { topic, message });
if (environment === EnvironmentType.LOCAL) {
Services.logger.debug('processing ${topic} notification locally, by explicitly calling the processNotification');
await this.processNotification(topic, message);
} else {
await this.publishingService.publish(topic, message);
}
}