【发布时间】:2023-04-03 08:46:02
【问题描述】:
我正在尝试为我用 python 3.9
编写的 aws lambda 函数编写单元测试。我尝试了不同的方法来模拟调用S3
的get_object
函数。我只想关注calculate
方法,以验证我是否得到了正确的计算结果。
当我尝试运行以下方法时,我收到关于 boto3
的凭据错误
python -m unittest tests/app-test.py
...
botocore.exceptions.NoCredentialsError: Unable to locate credentials
有没有办法从app.py
导入calculate
方法并模拟调用get_object
fn?
目录:
functions:
- __init__.py
- app.py
tests:
- __init__.py
- app-test.py
lambda 函数app.py
:
import json
import boto3
def get_object():
s3 = boto3.client('s3')
response = s3.get_object(Bucket='mybucket', Key='object.json')
content = response['Body'].read().decode('utf-8')
return json.loads(content)
stops = get_object()
def lambda_handler(event, context):
params = event['queryStringParameters']
a = int(params['a'])
b = int(params['b'])
result = calculate(a, b)
return {
'statusCode': 200,
'body': json.dumps(result)
}
def calculate(a, b):
return a + b
单元测试app-test.py
:
import unittest
from unittest import mock
with mock.patch('functions.app.get_object', return_value={}):
from functions.app import calculate
class TestCalculation(unittest.TestCase):
def test_should_return_correct_calculation(self):
# when
result = calculate(1, 2)
# then
self.assertEqual(3, result)
【问题讨论】:
-
有一个模拟boto调用的库:github.com/spulec/moto
-
为什么要在模块级别定义一个变量(
stops
),在导入时执行代码?从您发布的代码中无法理解其原因。 -
变量
stops
用于真正的lambda_handler
函数。我已将其设为全局,因为我想在 lambda 函数调用之间初始化此变量
标签:
python
unit-testing
aws-lambda
python-unittest
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python AWS Lambda的单元测试:导入模块之前的模拟函数 - Python技术站