Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Aws lambda AWS无服务器测试方法_Aws Lambda_Automated Tests_Integration Testing_Serverless Framework_Aws Serverless - Fatal编程技术网

Aws lambda AWS无服务器测试方法

Aws lambda AWS无服务器测试方法,aws-lambda,automated-tests,integration-testing,serverless-framework,aws-serverless,Aws Lambda,Automated Tests,Integration Testing,Serverless Framework,Aws Serverless,我不熟悉使用AmazonAWS的无服务器世界,我试图理解编写集成测试的经验法则 让我们给出以下我们想要测试的简单系统: 我们有一家超市,我们想把所有收据都存起来。系统包含一个数据库,其中包含一个数据表。一个作业队列,其中包含需要处理的所有事务,以及对队列中的每个作业进行一些预处理,然后将结果提交给数据库的两个工作人员 我们要测试下一个场景: 初始化新数据库和队列 两个工人 将作业插入队列 等等 验证结果 清洁环境 通过清理环境,下次运行测试时,同样的结果也会出现。如果我们不这样做,例如,数据将留

我不熟悉使用AmazonAWS的无服务器世界,我试图理解编写集成测试的经验法则

让我们给出以下我们想要测试的简单系统:

我们有一家超市,我们想把所有收据都存起来。系统包含一个数据库,其中包含一个数据表。一个作业队列,其中包含需要处理的所有事务,以及对队列中的每个作业进行一些预处理,然后将结果提交给数据库的两个工作人员

我们要测试下一个场景:

  • 初始化新数据库和队列
  • 两个工人
  • 将作业插入队列
  • 等等
  • 验证结果
  • 清洁环境
  • 通过清理环境,下次运行测试时,同样的结果也会出现。如果我们不这样做,例如,数据将留在数据库中,这将影响我们下次运行测试时的验证

    我的经验是和码头工人一起工作。有了它们,我可以
    docker组合起来
    一个新的数据库,并在设置时排队,而
    docker组合下来
    拆卸时所有的容器。这是一个简单的解决方案

    现在的问题是,对我的无服务器AWS应用程序进行此类测试的好方法是什么? db是dynamo db。队列是
    sqs
    ,“worker”是
    lambda
    s,在插入sqs时触发。当然,这是一个“简单”的例子,有点过头了,但问题比具体情况更大

    到目前为止,我找到的解决方案是:

  • 使用本地服务,如亚马逊官方的本地dynamo DB。但也包括当地的SQS,这些SQS既不是官方的,也不是他们支持的。缺点:部署Amazon服务时,结果可能不同
  • 每次使用
    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服务器的惊人工作。我个人更喜欢只运行我需要的东西,因此我的上述设置,而且他们没有为我需要的所有东西提供本地抽象,但这是一个很好的探索选择,它可能很适合您的需要。然而,它是一个大堆栈(如果我试图运行它,我的笔记本电脑会发疯)