制作看起来真实但没有任何效果的boto3调用
项目描述
placebo
placebo允许您模拟看起来与正常调用一样,但实际上没有任何效果的boto3调用。它通过允许您记录一组调用并将它们保存到数据文件中,然后在稍后(例如单元测试中)回放这些调用(而不触及AWS端点)来实现这一点。
安装
$ pip install placebo
快速入门
placebo使用botocore中的事件机制来完成大部分工作。首先,您需要一个boto3会话对象。
import boto3
import placebo
session = boto3.Session()
一旦您有了会话对象,您可以像这样告诉placebo有关会话的信息
pill = placebo.attach(session, data_path='/path/to/response/directory')
data_path
是您想存储响应或包含您想回放的先前记录的响应的目录的路径。
attach
函数返回一个 Pill
对象的实例。该对象将用于控制由此会话对象创建的所有客户端的所有请求的记录和回放。
您可能想做的第一件事是记录一些请求。为此,只需这样做
pill.record()
默认情况下,record
方法将导致记录所有服务的所有响应到 data_path
。如果您只对特定服务的响应感兴趣,可以通过传递服务名称列表来限制记录。
pill.record(services='ec2,iam')
这将限制记录到来自 ec2
服务和 iam
服务的响应。如果您只想将记录限制为单个服务中的特定操作,可以这样做
pill.record(services='ec2', operations='DescribeInstances,DescribeKeyPairs')
从这一点开始,任何匹配录音规格并且从会话中创建的客户端都将具备安慰剂意识。要记录响应,只需创建客户端并像平常一样使用即可。
aws_lambda = session.client('lambda')
aws_lambda.list_functions()
# ... more lambda calls ...
每个响应都将保存为单独的JSON数据文件,这些文件存储在你连接会话时指定的 data_path
路径中。来自同一服务和操作的多个响应将作为单独的文件存储,并且在回放时将以相同的顺序播放。
稍后,要回放已保存的请求
import boto3
import placebo
session = boto3.Session()
pill = placebo.attach(session, data_path='/path/to/response/directory')
pill.playback()
aws_lambda = session.client('lambda')
aws_lambda.list_functions()
# ... mocked response will be returned
附加到默认会话
有时,安慰剂需要附加到Boto3的默认会话对象。
要将安慰剂附加到默认会话,必须通过调用 boto3.setup_default_session()
显式设置默认会话。然后可以在 boto3.DEFAULT_SESSION
访问默认会话。
例如
import boto3
import placebo
# Explicity set up the default session and attach Placebo to it.
boto3.setup_default_session()
session = boto3.DEFAULT_SESSION
pill = placebo.attach(session, data_path='/path/to/response/directory')
pill.record()
# Now make Boto3 calls using the default session.
client = boto3.client('ec2')
client.describe_images(DryRun=False)
这对于编写对Boto3默认会话有依赖性的遗留代码测试特别有用。
使用pickle
响应也可以使用pickle而不是JSON文档进行保存。这可以用来避免响应中复杂类型序列化的问题。
要启用pickle格式
pill = pill = placebo.attach(session, record_format="pickle")
手动模拟
您还可以手动添加模拟响应
list_functions_response = [
{
"Version": "$LATEST",
"CodeSha256": "I8Scq2g6ZKcPIvhKzvZqCiV4pDysxq4gZ+jLcMmDy5Y=",
"FunctionName": "foobar",
"MemorySize": 128,
"CodeSize": 876521,
"FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:foobar",
"Handler": "foobar.handler",
"Role": "arn:aws:iam::123456789012:role/foobar-role",
"Timeout": 30,
"LastModified": "2015-11-06T22:30:32.164+0000",
"Runtime": "python2.7",
"Description": "Foos all of the bars"
}]
pill.save_response(service='lambda', operation='ListFunctions',
response_data=list_functions_response, http_response=200)
您可以为特定操作添加额外的响应,响应将按顺序返回。最后一个参数是可选的HTTP响应代码。默认值是200。
作为装饰器的使用
安慰剂还提供了一个装饰器以简化使用。
首先,您需要使用 placebo_session
装饰您的测试方法,并在方法中包含 session
关键字参数,例如
@placebo_session
def test_your_function(self, session):
foo = Foo()
arn = foo.create_iam_roles(session)
self.assertEqual(arn, "arn:aws:iam::123:role/{}".format(foo.role_name))
现在,您将能够使用环境变量记录AWS交互
$ PLACEBO_MODE=record nosetests tests.tests:TestFoo.test_create_iam_roles
您可以可选地传递要使用的AWS配置文件
$ PLACEBO_PROFILE=foo PLACEBO_MODE=record nosetests tests.tests:TestFoo.test_create_iam_roles
您可以可选地设置要使用的记录格式
$ PLACEBO_FORMAT=pickle PLACEBO_MODE=record nosetests tests.tests:TestFoo.test_create_iam_roles
在此示例中,已创建以下JSON数据块
tests/placebo/TestFoo.test_create_iam_roles
tests/placebo/TestFoo.test_create_iam_roles/iam.CreateRole_1.json
tests/placebo/TestFoo.test_create_iam_roles/iam.GetRole_1.json
tests/placebo/TestFoo.test_create_iam_roles/iam.GetRolePolicy_1.json
tests/placebo/TestFoo.test_create_iam_roles/iam.PutRolePolicy_1.json
JSON创建后,只需删除环境变量并重新运行您的测试即可
$ nosetests tests.tests:TestFoo.test_create_iam_roles