本文共 4698 字,大约阅读时间需要 15 分钟。
flashback
在LinkedIn,我们经常开发需要与第三方网站进行交互的Web应用程序。 我们还采用自动测试来确保软件在交付生产之前的质量。 但是,测试仅在可靠时才有用。
考虑到这一点,测试具有外部依赖性(例如在第三方网站上)可能会带来很大的问题。 由于Internet并非100%可靠,因此这些外部站点可能会更改,恕不另行通知,遭受宕机或暂时无法访问。
如果我们的测试之一依赖于能够与第三方网站进行通信,那么很难确定失败的原因。 失败可能是由于LinkedIn的内部更改,第三方网站的维护者进行的外部更改或网络基础结构出现问题。 您可以想象,与第三方网站交互失败的原因有很多,您可能想知道,我将如何处理此问题?
好消息是,有许多可以帮助您的Internet模拟工具。 是这样一种工具。 它通过拦截由Web应用程序启动的HTTP连接,然后稍后重播它们来起作用。 对于测试,可以使用Betamax将HTTP上的任何交互替换为以前记录的响应,从而可以非常可靠地提供响应。
最初,我们选择在LinkedIn的测试自动化中使用Betamax。 效果很好,但是我们遇到了一些问题:为了应对这些挑战,我们决定以Betamax确立的想法为基础,并创建自己的Internet模拟工具Flashback。 我们还自豪地宣布Flashback现在是开源的。
闪回旨在模拟HTTP和HTTPS资源(例如Web服务和 API)以进行测试。 它记录HTTP / HTTPS请求并回放以前记录的HTTP事务(我们称为“场景”),因此不需要外部连接到Internet即可完成测试。
闪回还可以根据请求的部分匹配来重放场景。 它使用“匹配规则”来实现。 匹配规则将传入的请求与先前记录的请求相关联,然后将其用于生成响应。 例如,以下代码段实现了一个基本的匹配规则,其中测试方法通过 “匹配”传入的请求。
HTTP请求通常包含URL,方法,标头和正文。 闪回允许为这些组件的任何组合定义匹配规则。 闪回还允许用户将白名单或黑名单标签添加到URL查询参数,标头和正文。
例如,在OAuth授权流程中,请求查询参数可能如下所示:
oauth_consumer_key = "jskdjfljsdklfjlsjdfs" , oauth_nonce = "ajskldfjalksjdflkajsdlfjasldfja;lsdkj" , oauth_signature = "asdfjaklsdjflasjdflkajsdklf" , oauth_signature_method = "HMAC-SHA1" , oauth_timestamp = "1318622958" , oauth_token = "asdjfkasjdlfajsdklfjalsdjfalksdjflajsdlfa" , oauth_version = "1.0"
由于OAuth要求客户端每次都为oauth_nonce生成一个新值, 因此每个请求中的许多值都会更改。 在我们的测试中,我们需要验证oauth_consumer_key,oauth_signature_method和oauth_version的值,同时还要确保请求中存在oauth_nonce , oauth_signature , oauth_timestamp和oauth_token 。 闪回使我们能够创建自己的匹配规则来实现此目标。 此功能使我们可以测试具有时变数据,签名,令牌等的请求,而无需在客户端进行任何更改。
这种灵活的匹配和无需连接Internet即可运行的能力是将闪回与其他模拟解决方案区分开的属性。 其他一些值得注意的功能包括:
记录HTTP事务以供以后使用Flashback回放是一个相对简单的过程。 在深入研究该过程之前,让我们首先列出一些术语:
为了记录场景,您必须向目标发出真实的外部请求,然后HTTPS请求和响应将使用您指定的匹配规则存储在场景中。 录制时,闪回的行为与典型的MITM(中间人)代理完全相同,只有在回放模式下,连接流和数据流才被限制在客户端和代理之间。
要查看实际的闪回,让我们通过执行以下操作来创建一个捕获与example.org交互的场景:
1.查看闪回源代码:
git clone https: // github.com / linkedin / flashback.git
2.启动闪回管理服务器:
. / startAdminServer.sh -port 1234
3.启动 。 请注意,上面的闪回将以记录模式在localhost端口5555上启动。匹配规则要求完全匹配(匹配HTTP正文,标头和URL)。 该场景将存储在/ tmp / test1下 。
4.闪回现已准备好进行录制,因此可以使用它将请求代理到example.org:
curl http: // www.example.org -x localhost: 5555 -X GET
5.闪回可以(可选)将多个请求记录在一个请求中。 要完成录制,请 。
6.要验证已记录的内容,我们可以在输出目录( / tmp / test1 )中查看场景的内容。 它应 。
也很容易。
要回放以前存储的场景,请使用与录制时相同的基本设置。 唯一的区别是您 。
一种验证响应是否来自场景而不是外部来源的方法是在执行步骤1到步骤6时临时禁用Internet连接。另一种方法是修改场景文件并查看响应是否相同。就像文件中的内容一样。
这是 。
使用Flashback记录和重放HTTPS事务的过程与用于HTTP事务的过程非常相似。 但是,需要特别注意用于HTTPS的SSL组件的安全证书。 为了使闪回充当MITM代理,必须创建证书颁发机构(CA)证书。 该证书将在客户端和Flashback之间的安全通道的创建过程中使用,并将允许Flashback检查代理所请求的HTTPS中的数据。 然后,应将此证书存储为受信任的源,以便客户端在调用它时能够对闪回进行身份验证。 有关如何创建证书的说明, 许多资源可能会很有帮助。 大多数公司都有自己的内部政策来管理和保护证书-请务必遵循您的政策。
在此值得注意的是,闪回仅用于测试目的。 随时将Flashback与您的服务集成在一起,但是请注意,Flashback的记录功能将需要存储线路中的所有内容,然后在重播模式下使用它。 我们建议您格外注意,以确保不会无意间记录或存储任何敏感成员数据。 任何可能违反公司数据保护或隐私政策的行为都是您的责任。
一旦考虑了安全证书,就记录设置而言,HTTP和HTTPS之间的唯一区别就是添加了一些其他参数。
通过Flashback ,包括上述条款。
通过闪回重放HTTPS事务使用与记录相同的过程。 唯一的区别是场景模式设置为“播放”。 此演示了 。
为了灵活地进行测试,闪回允许您动态更改场景并匹配规则。 动态更改场景可以测试具有不同响应的相同请求,例如成功, time_out , rate_limit等。 仅适用于我们已发布数据以更新外部资源的场景。 请参见下图作为示例。
能够动态使我们能够测试复杂的场景。 例如,我们有一个用例,要求我们测试对Twitter的公共和私有资源的HTTP调用。 对于公共资源,HTTP请求是恒定的,因此我们可以使用“ MatchAll”规则。 但是,对于私有资源,我们需要使用OAuth使用者机密和OAuth访问令牌对请求进行签名。 这些请求包含许多具有不可预测值的参数,因此静态MatchAll规则将不起作用。
在LinkedIn上,闪回主要用于在集成测试中模拟不同的Internet提供商,如下图所示。 第一个图显示了LinkedIn生产数据中心内部的内部服务,该内部服务通过代理层与Internet提供商(例如Google)进行交互。 我们想在测试环境中测试此内部服务。
第二和第三张图显示了我们如何在不同环境中记录和回放场景。 记录发生在我们的开发环境中,在该环境中,用户在与代理启动相同的端口上启动闪回。 从内部服务到提供者的所有外部请求将通过闪回而不是我们的代理层。 在记录了必要的场景之后,我们可以将它们部署到我们的测试环境中。
在测试环境(隔离且无法访问Internet)中,闪回在与开发环境相同的端口上启动。 所有HTTP请求仍旧来自内部服务,但是响应将来自闪回而不是Internet提供商。
我们想看看将来是否可以支持非HTTP协议,例如FTP或JDBC,甚至可以为用户提供使用MITM代理框架注入其自定义协议的灵活性。 我们将继续改进Flashback设置API,以更轻松地支持非Java语言。
我们很幸运地在GTAC 2015上展示了Flashback。在展会上,几位观众询问我们是否将Flashback作为一个开源项目发布,以便他们可以将其用于自己的测试工作。
我们很高兴地宣布闪回现已开放源代码,并且可以通过BSD(伯克利软件发行)两条款许可获得。 首先,请访问 。
最初发布在 。 经许可重新发布。
闪回是由 , 和 ,并受到启发。 特别感谢 , , , 和提供的代码审查帮助。 我们还要感谢我们的管理层- ( , , ( , ( 和 ( 他们为Flashback的开发和开源提供了支持。
翻译自:
flashback
转载地址:http://vzpzd.baihongyu.com/