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

Cly*_*row 6 amazon-web-services aws-lambda aws-sam-cli aws-sam

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

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

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

编辑。我的解决方案

  • 添加pytest

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

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

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

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

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

小智 5

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


小智 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()
Run Code Online (Sandbox Code Playgroud)

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

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

编辑:我上面提到的博客文章已准备就绪,您可以在这里阅读: