【问题标题】:Tests methodologies for AWS server-less测试 AWS 无服务器的方法
【发布时间】:2020-11-03 02:38:19
【问题描述】:

我是使用 Amazon AWS 的无服务器世界的新手,我尝试了解编写集成测试的经验法则。

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

我们有一家超市,我们想为它保存所有收据。系统包含一个带有单个数据表的数据库。一个作业队列,其中包含所有需要处理的事务和几个工人,它们对队列中的每个作业进行一些预处理,然后将结果提交到数据库。

我们要测试下一个场景:

  1. 初始化新数据库和队列
  2. 初始化几个工人
  3. 将作业插入队列
  4. 等等
  5. 验证结果
  6. 清洁环境

通过清理环境,我们下次运行测试时会得到相同的结果。如果我们不做,比如数据会留在数据库中,就会影响我们下次运行测试时的验证。

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

现在,问题是为我的无服务器 AWS 应用程序进行此类测试的好方法是什么? 数据库是dynamo db。队列是sqs,“工人”是lambdas,它们在sqs 插入时触发。当然,这是一个“简单”的例子,它已经过时了,但问题比具体情况要大。

目前我找到的解决方案:

  1. 使用本地服务,例如亚马逊官方提供的本地发电机数据库。但也不是官方的,也不是他们支持的本地 SQS。缺点:部署时亚马逊服务的结果可能会有所不同。
  2. 每次使用sam deploy 在亚马逊上运行测试。我可以创建一个新堆栈,但资源会永远留在 Amazon 的服务器中(例如 s3 存储桶和队列)。缺点:代码不是本地的,难以调试 + 需要时间部署。
  3. 对所有测试使用相同的资源并在开始时清理它们。缺点:丑陋的代码和项目之间大量代码重复的选项。

根据我的搜索,没有常见的“如何编写测试教程”,我想听听您的经验。

【问题讨论】:

    标签: aws-lambda automated-tests integration-testing serverless-framework aws-serverless


    【解决方案1】:

    我用类似的设置做了很多测试,这就是我处理事情的方式。目标是在完整的模拟和针对正在运行的服务器进行测试之间找到平衡。

    对于 dynamoDb 和 elasticsearch,我使用可用的 docker 实例。在我的 Jest 设置中的每次测试之前,我都会清除数据库表和弹性搜索索引。只需编写一些简单的代码来遍历表列表并擦除它们。

    在每个测试中,我都会为必要的表播种,以确保数据不会与其他测试发生冲突,因为 Jest 并行运行 - 我的意思是,如果我要进行测试以按用户获取所有条目,那么我确保此用户 ID 仅用于该测试种子,以防止另一个测试种子影响结果。

    我使用的所有 aws 服务都有包装器,例如 Cognito、SNS、SQS 等,它们为我抽象了一点 aws。我使用nock 对这些进行单元测试,我特别使用nock.recorder.rec() 命令,它可以让我捕获来自aws 的响应。我对所有这些根级别的调用进行这些测试。这确保我的代码可以在实时服务器上运行,但可以重复而不依赖于这些服务器。

    对于所有其他单元测试(这里的单元测试是指仅测试函数而不涉及运行 sls offline 的测试),我将使用 jest 模拟和模拟 aws 方法。由于我的低级 aws 包装器是用 nock 测试和记录的,现在我只是模拟一些东西以便于测试,因为我相信模拟方法可以按预期工作。

    对于使用sls offline 时的集成/e2e 测试,事情会变得更加棘手,因为当事情被加载到正在运行的服务器中时,我无法模拟/诺克。为此,我为每个 aws 服务提供了一个自定义端点(每个 aws 服务都有一个接受此参数的配置 - 默认为 null,它将使用真正的 aws 服务器,但您可以创建一个本地 http/express 服务器来模拟响应)。看看这个SO question,我在其中回答了如何使用 Cognito 执行此操作 - 所有其他服务的过程都是相同的。

    完成整个测试框架设置需要一些工作,但一旦不这样做,它就可以完美无瑕地工作,并且还提供了 CI 服务器可以运行的测试设置。

    我还应该提到 LocalStack 的出色工作,它为大多数 aws 服务提供本地 docker 服务器。我个人更喜欢运行我需要的东西,因此我上面的设置,而且它们没有为我需要的所有东西提供本地抽象,但它是一个很好的探索选择,它可能很好地满足你的需求。然而,这是一个很大的堆栈(如果我尝试运行它,我的笔记本电脑会发疯)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-07
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 2019-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多