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
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小智 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 运行时毫无问题地加载它。
希望这会有所帮助,一旦我完成为我的博客文章创建示例,我将返回一个更完整的示例。
| 归档时间: |
|
| 查看次数: |
633 次 |
| 最近记录: |