我们是否有办法在本地实例化SNS以便能够运行单元测试?我知道dynamoDB可以使用DynamoDBLocal进行本地实例化,SNS是否也支持相同?如果是这样,任何人都可以提供文件吗?提前谢谢。
答案 0 :(得分:6)
不,目前AWS还没有提供在本地运行SNS的方法。但是,我们可以通过多种方式测试我们的应用程序,以确保在与外部服务集成时的良好行为。
您应该考虑以下三个选项:
亚马逊没有为测试应用程序提供沙箱区域。但是,没有什么能阻止我们针对集成层注册事件。
例如,在AWS上注册名为“NewAccountEvent-Dev”的主题,并提供此主题以进行集成测试。这将确保应用程序正确构建对AWS的请求。通常我希望大多数成熟的团队都有几个完全集成的测试环境。尝试并确保生产前的区域与生产完全相同。
作为开发人员,我们应该尽力确保我们尽早解决问题。即使在测试环境中部署应用程序之后,解决集成问题在开发过程中也是非常正确的。为了改进我们的集成环境,我们可以使用概念调用模拟。模拟将允许我们在构建时获取问题。
Mocking允许您测试您的应用程序是否能够正确响应您期望从SNS发送的消息。您将手动设置响应并开始针对假SNS服务编写测试。有很多模拟工具可以帮助你快速编写模拟。语言与您选择的框架最终会推动您选择的框架。就个人而言,我最熟悉的是Mockito,因为我会在春季开机时使用它。
最后,您可以运行您的应用程序并包含一个模拟SNS的服务。这类似于DynamoDBLocal FakeSNS。如果你正在编写一个与SNS有很大整合的应用程序。即删除,创建,处理权限等。这个项目将很好看。这些服务器更丰富,因为它们通常在服务本身内实现逻辑,而不是模拟接口。
不幸的是,Fake SNS目前似乎不是很多GitHub活动;所以我鼓励你继续做更多的研究。
答案 1 :(得分:2)
不幸的是,没有可在本地运行的SNS实现。因此,您必须使用诸如mockito之类的实用程序来实现模拟测试。
答案 2 :(得分:1)
SNS的另一个好假实施是https://bitbucket.org/atlassian/localstack
Localstack提供了几种亚马逊aws服务的虚假实现。我用它来测试本地和CI上的完整sns / sqs通信。效果很好。
答案 3 :(得分:1)
我们有一个notificationService处理程序,所有SNS通知都通过这样的代码调用来进行处理。
await ApplicationService.notification.notify(NotificationType.EMAIL_UPSERTED, { id: user.id.toString() });
这将调用通知服务notify函数,该函数在本地环境中将立即执行通知,而不是发送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);
}
}