如何对使用分层方法的Lambda逻辑进行单元测试?

时间:2019-02-15 08:44:44

标签: amazon-web-services aws-lambda aws-sam aws-sam-cli

嗨,我有我的AWS Lambda,我想在上面添加一个图层。我希望能够仅测试lambda的单个方法。但是,他们中的许多人都使用层逻辑,因此在我看来这并不容易。最好的方法是什么?

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

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

编辑。我的解决方案

  • 添加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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

我正在尝试做同样的事情,但我自己找不到任何答案。在考虑了一下问题之后,我想出了一种我认为很干净的方法。我正在写一篇关于它的博客文章,但是我基本上会使用Factory模式来加载我的层代码,并在单元测试期间模拟掉代码。

它将遵循以下原则:

假设所有的层代码都封装在一个名为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设置器模拟出Layer代码,但是在实际的Lambda函数中,您只需使用Factory加载共享代码,这要归功于条件导入和Lambda运行时将其注入Layer可以毫无问题地加载它。

希望这会有所帮助,完成博客文章的示例后,我将回头再举一个更完整的示例。

编辑:我上面提到的博客文章已经准备好,您可以阅读here