Aws lambda AWS无服务器测试方法
我不熟悉使用AmazonAWS的无服务器世界,我试图理解编写集成测试的经验法则 让我们给出以下我们想要测试的简单系统: 我们有一家超市,我们想把所有收据都存起来。系统包含一个数据库,其中包含一个数据表。一个作业队列,其中包含需要处理的所有事务,以及对队列中的每个作业进行一些预处理,然后将结果提交给数据库的两个工作人员 我们要测试下一个场景:Aws lambda AWS无服务器测试方法,aws-lambda,automated-tests,integration-testing,serverless-framework,aws-serverless,Aws Lambda,Automated Tests,Integration Testing,Serverless Framework,Aws Serverless,我不熟悉使用AmazonAWS的无服务器世界,我试图理解编写集成测试的经验法则 让我们给出以下我们想要测试的简单系统: 我们有一家超市,我们想把所有收据都存起来。系统包含一个数据库,其中包含一个数据表。一个作业队列,其中包含需要处理的所有事务,以及对队列中的每个作业进行一些预处理,然后将结果提交给数据库的两个工作人员 我们要测试下一个场景: 初始化新数据库和队列 两个工人 将作业插入队列 等等 验证结果 清洁环境 通过清理环境,下次运行测试时,同样的结果也会出现。如果我们不这样做,例如,数据将留
docker组合起来
一个新的数据库,并在设置时排队,而docker组合下来
拆卸时所有的容器。这是一个简单的解决方案
现在的问题是,对我的无服务器AWS应用程序进行此类测试的好方法是什么?
db是dynamo db。队列是sqs
,“worker”是lambda
s,在插入sqs时触发。当然,这是一个“简单”的例子,有点过头了,但问题比具体情况更大
到目前为止,我找到的解决方案是:
samdeploy
在amazon上运行测试。我可以创建一个新的堆栈,但是资源永远留在Amazon的服务器中(比如s3存储桶和队列)。缺点:代码不是本地的,很难调试+需要时间部署从我搜索的内容来看,没有常见的“如何编写测试教程”,我想听听您的经验。我使用类似的设置进行了大量测试,这就是我处理问题的方法。目标是在完整的模拟和针对正在运行的服务器的测试之间找到平衡 对于dynamoDb和elasticsearch,我使用可用的docker实例。在Jest设置的每次测试之前,我都会清除db表和elasticsearch索引。只是写了一些简单的代码来遍历表列表并删除它们 在每个测试中,我对必要的表进行种子设定,以确保数据不会与其他测试冲突,因为Jest是并行运行的——我的意思是,如果我要让一个测试按用户获取所有条目,那么我将确保该用户ID仅用于该测试种子中,以防止另一个测试种子影响结果 我使用的所有aws服务都有包装,比如Cognito、SNS、SQS等,它们为我抽象了一些aws。我使用
nock.recorder.rec()
命令对这些进行单元测试,该命令允许我捕获aws的响应。我对所有这些根级别调用进行这些测试。这确保了我的代码可以在实时服务器上运行,但可以在不依赖这些服务器的情况下重复
对于所有其他单元测试(这里的单元测试指的是只测试一个函数而不涉及离线运行sls
For ex的测试),我将使用jest mock和mock aws方法。因为我的低级aws包装器是用nock测试和记录的,所以现在我只是为了简单的测试而模拟一些东西,因为我相信模拟方法会像预期的那样工作
对于离线使用sls时的集成/e2e测试
来说,事情更加棘手,因为在运行的服务器中加载东西时,我无法模拟/nock。为此,我为每个aws服务提供了一个自定义端点(每个aws服务都有一个接受此参数的配置-默认为null,它将使用真正的aws服务器,但您可以创建一个本地http/express服务器来模拟响应)。看看这里,我回答了如何使用Cognito实现这一点——所有其他服务的流程都是相同的
完成整个测试框架设置需要一些工作,但一旦完成,它的工作就会非常完美,还提供了一个CI服务器可以运行的测试设置
我还应该提到它为大多数aws服务提供本地docker服务器的惊人工作。我个人更喜欢只运行我需要的东西,因此我的上述设置,而且他们没有为我需要的所有东西提供本地抽象,但这是一个很好的探索选择,它可能很适合您的需要。然而,它是一个大堆栈(如果我试图运行它,我的笔记本电脑会发疯)