使用外部服务/API 的代码的TDD BDD最佳实践

4
我正在使用 Twitter gem,它基本上访问 Twitter 并让我获取推文、时间线等。它非常好用,但是我的代码中使用了很多它返回的东西,我需要进行测试。这个 gem 返回的东西不是简单的字符串,而是相当复杂的对象(也有点可怕),所以我感到困惑。
因此,我正在寻找一个答案、书籍、博客、开源项目,可以向我展示在外部服务周围进行测试的正确和错误方法。
最好是非语言或 Ruby/Rails 为中心的答案。
2个回答

6
你所说的其实是两种不同类型的测试——单元测试和集成测试。
单元测试将独立于任何外部数据对方法的有效性进行测试。你应该研究一些基于你使用的语言的模拟框架。你基本上要做的就是用测试来表达一些等价的东西,比如“如果这些假设是合格的,那么这个测试应该产生...”。模拟框架将定义你的假设,以便于说某些类/对象以特定方式设置并且可以被认为是有效的。这些测试不会依赖于Twitter是否在线或第三方库/API是否响应。
集成测试将针对数据源实时执行测试,消费库/API以执行实际操作。由于你使用的是第三方服务,所以在向服务写入内容(例如,如果你正在创建新的推文)时会变得棘手。如果是这样,你可以创建一个专门用于写操作的Twitter账户。通常情况下,如果你正在对本地数据库进行测试,你可以使用事务来测试类似的操作;回滚事务而不是提交它们。
以下是一些非语言特定的高层定义:

我来自.NET堆栈,所以我不会假装对Ruby了解很多。 然而,快速的谷歌搜索揭示了以下内容:


感谢Joseph的回复。我以前用过Mocha,但想知道如何正确使用它,避免陷阱等。实时测试很好,每次重置我的Twitter帐户都很麻烦,我不相信你可以通过编程方式做到这一点。 - robodisco
@joseph.ferris BDD如何测试第三方API失败的全栈。例如测试Twitter / Dropbox / Facebook返回任何众多错误代码的情况。显然,UI处理这些问题的方式很重要,并且需要在此级别进行测试。在生产BDD中如何处理这种情况? - Jason
@jason 很遗憾,我没有直接使用BDD的经验。我们目前有几个第三方API实现,并且通常编写客户端类来处理基本连接以及发送/接收操作。它如何融入更大的画面是,所有这些客户端类不会直接返回本地错误,而是将其转换为可以在整个堆栈上传播的通用异常,其中UI可以统一处理它。对于Twitter和LinkedIn,我已经在RestSharp之上构建了自定义类,并提取了用于模拟的接口。 - Joseph Ferris

0

你可以轻松地使用类似WireMock http://wiremock.org/ 的工具在http层进行存根。我现在已经在几个项目中使用过它,它非常强大和快速。这将消除所有基于代码的模拟设置代码 - 只需启动带有相关映射的jar文件,就可以轻松完成。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接