跳转到主要内容

制作看起来真实但没有任何效果的boto3调用

项目描述

placebo

codecov

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

项目详情


下载文件

下载您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分发

placebo-0.10.0.tar.gz (15.1 kB 查看散列)

上传时间

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面