我正在尝试找到一种方法来测试我们的平台与外部服务器(例如 Twitter)的交互。
在我们的在线照片共享应用程序中,例如,我们具有允许用户在他/她的 Twitter 提要上发布内容的功能。该代码依赖于 Twitter4J。
我们如何编写自动化测试来检查推文是否真的被发送到提要、在 Facebook 上发布照片等。
难点在于:我几乎无法修改 API 来进行我的具体测试,当然,我对外部系统也没有影响。
我正在尝试找到一种方法来测试我们的平台与外部服务器(例如 Twitter)的交互。
在我们的在线照片共享应用程序中,例如,我们具有允许用户在他/她的 Twitter 提要上发布内容的功能。该代码依赖于 Twitter4J。
我们如何编写自动化测试来检查推文是否真的被发送到提要、在 Facebook 上发布照片等。
难点在于:我几乎无法修改 API 来进行我的具体测试,当然,我对外部系统也没有影响。
在这种情况下,我通常更喜欢使用模拟来创建我的大部分测试,所以我不必担心 Twitter 是否关闭、无法访问、速度慢,或者是否让用户对大量的帖子感到恼火,这些帖子只是为了测试。使用 mock,您不太关心最终行为,而更关心 API 是否被正确调用。Mocks 至少提供了一个看起来像外部 API 的 API,并且可以以相同的方式调用(您使用开发人员或您的产品提供的配置参数来指向您的模拟服务)并返回一个值。可以将更智能的模拟设置为在调用其 API 方法时“播放”某些值,因此您还可以获得您期望的响应(在测试中较早设置响应之后)。
这可以减少您对 Twitter 本身的依赖,但您仍然需要在某些时候使用模拟帐户进行一些端到端测试。如果让自动化与 Twitter 一起工作比你预期的更困难,那么你可能只能使用手动测试 - 但希望 Twitter 的 API 允许轻松自动检查你的代码是否正确连接。Glowcoder 在另一个答案中讨论了这个过程,所以我不会重复那个解释:)
测试的基础之一是隔离——如何使测试环境尽可能地隔离。当您处理内部资源时,这相当容易,因为您可以完全控制环境。外部资源,不多。
对于这种情况,我建议您创建几个测试 Twitter 帐户。(我希望这不违反他们的 TOS,我会先检查一下。)您可能有 TrarothTest 和 TrarothTestFollower。您可以让它自动发布到 TrarothTest,然后等待验证 TrarothTestFollower 是否从 TrarothTest 获得了一条新推文。
因此,您正在处理您可以完全控制的帐户,尽可能地隔离环境。
您会不时遇到无法控制的事情。如果 twitter 宕机了(当 twitter 宕机时,潮人会怎么做?:-O)或者有人开着铁锹穿过你当地的光纤线路跑出城外?在这种情况下,您似乎需要一个替代方案:本地托管的 twitter 站点。维护可能需要做很多额外的工作,但您可以将流量发送到您的本地站点并确保它是您所期望的。然后模拟推文并“验证它是否发生”。
外部系统肯定会妨碍进行端到端测试。有时,您必须与产品的其余部分分开测试与外部系统的接口。
例如,在我目前的工作中,我们的产品功能之一是能够在银行账户之间转移资金。我们没有“测试银行账户”或在银行模拟银行账户的方法。我们通过 ACH 文件转移资金,因此我测试资金转移功能的方法有两个:使用自动化测试我们如何生成 ACH 文件,以及手动测试银行是否可以处理我们生成的文件。
您可以对 Twitter 界面使用相同的方法。
另一个想法:我不了解 Facebook,但 Twitter 没有 RSS 提要吗?
这取决于您是否确信外部系统将与其合同保持一致。
我一直处于“外部”系统由组织内的其他组维护的情况。另一组因其 API 的工作原理而臭名昭著,没有适当的沟通。也碰巧他们的更改不会更改 WSDL(它是一个 Web 服务)。
在这种情况下,我们针对外部系统进行了一整套集成测试,以确保我们检测到任何偏差。这些测试对我们很有帮助。我们能够及早发现偏差并纠正它们。