13

嗨,我有我的 AWS Lambda,我想给它添加一个层。我希望能够只测试 lambda 的单一方法。然而,他们中的许多人使用层逻辑,因此在我看来并不容易。这样做的最佳方法是什么?

一种方法是打包层,主机在某处并将其用作依赖项。在那种情况下,为什么还要费心使用图层?

我的另一个想法是使用 sam-cli 在本地部署 lambda。我知道如何使用它来测试整个 lambda 逻辑,但我看不到如何单独对方法进行单元测试;/你有什么经验?韩国

编辑。我的解决方案

  • 添加 pytest

  • 将所有测试放在test目录中

  • 添加调用测试的测试 lambda 处理程序

import pytest def lambda_handler(event, _): res = pytest.main(['-x', './tests']) return res

  • 添加指向先前创建的 lambda 处理程序的 template.yml

Resources: MyFunction: Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction Properties: CodeUri: src/ Handler: test.lambda_handler Runtime: python3.6 Events: MyInfo: Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api Properties: Path: /my-service/test Method: get Environment: Variables: ELASTICSEARCH_DOC_TYPE: "article" ELASTICSEARCH_INDEX: "artilces" ELASTICSEARCH_HOST: "elastic" ELASTICSEARCH_PORT: "9200" ELASTICSEARCH_URL: "http://my_elastic.com:9200" Layers: - arn:aws:lambda:eu-west-1:XXXXXXXXXXXXX:layer:lambda_layer:37

  • sam local invoke --no-event
4

2 回答 2

4

就我而言,我使用 moto 库来模拟 AWS 服务,因此不能选择使用 sam local。我刚刚在我的测试文件中将我的 lambda 层的路径添加到我的 sys 路径中,它对我有用。

于 2021-01-30T10:07:47.963 回答
1

我试图做同样的事情,但我自己在任何地方都找不到答案。在考虑了这个问题之后,我想出了一个我认为非常干净的方法。我正在完成一篇关于它的博客文章,我将在此处发布,但基本上我使用工厂模式来加载我的层代码并在单元测试期间模拟代码。

它会沿着这些方向发展:

假设您的所有层代码都封装在一个名为 SharedCode 的类中。您可以使用通过条件导入加载 SharedCode 的静态工厂:

class Factory:

   def __init__(self):
       self._shared = None

   def set_shared_code(self, shared_code):
       self._shared = shared_code

   def get_shared_code(self):
       if not self._shared:
           from shared_code import SharedCode
           self._shared = SharedCode()

       return self._shared


FACTORY = Factory()

在您的测试中,您可以使用 Factory setter 模拟 Layer 代码,但在您的实际 Lambda 函数中,您只需使用 Factory 加载共享代码,这要归功于条件导入和注入 Layer 的 Lambda 运行时,它将能够加载它没有问题。

希望这会有所帮助,一旦我完成为我的博客文章创建示例,我会回过头来提供一个更完整的示例。

编辑:我上面提到的博客文章已经准备好了,你可以在这里阅读:

于 2019-04-28T02:51:55.657 回答