嗨,我有我的AWS Lambda,我想在上面添加一个图层。我希望能够仅测试lambda的单个方法。但是,他们中的许多人都使用层逻辑,因此在我看来这并不容易。最好的方法是什么?
一种方法是打包层,将宿主放在某个地方并将其用作依赖项。在那种情况下,为什么还要费心使用图层?
我的另一个想法是使用sam-cli在本地部署lambda。我知道如何使用它来测试整个lambda逻辑,但是我看不到如何分别对测试方法进行单元化; / 你有什么经验? KR
编辑。我的解决方案
添加pytest
将所有测试放在test
目录中
添加测试lambda 调用测试的处理程序
import pytest
def lambda_handler(event, _):
res = pytest.main(['-x', './tests'])
return res
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
答案 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: