如何测试依赖于boto和Amazon AWS服务的模块?

时间:2012-08-01 18:06:24

标签: python testing mocking boto amazon-dynamodb

我正在围绕boto.dynamodb.layer2编写一个非常小的Python ORM。我想为它编写测试,但我不希望测试实际与AWS通信,因为这需要复杂的设置,凭据,网络访问等。

由于我计划开源模块,包括源代码中的凭据似乎是一个坏主意,因为我将收取使用费用,并且在环境中包含凭据是一种痛苦。

将我的测试耦合到网络似乎是一个坏主意,因为它会使测试运行速度变慢,或者可能导致测试因网络错误或限制而失败。我的目标不是测试boto的DynamoDB接口或AWS。我只想测试自己的代码。

我计划使用unittest2来编写测试,并使用mock来模拟打到网络的boto部分,但我以前从未这样做过,所以我的问题归结为这些:

  1. 我是以正确的方式来做这件事吗?
  2. 还有其他人这样做过吗?
  3. boto.dynamodb界面中是否有最适合模拟的特定点?

3 个答案:

答案 0 :(得分:4)

我认为您有正确的方法,您绝对不希望您的测试与AWS的实际通信捆绑在一起。嘲笑服务绝对是正确的做法。

答案 1 :(得分:4)

完全回答我的问题:

  1. 与@ pcalcao的答案一样,嘲笑服务是正确的做法。它甚至没有我想象的那么难 - 测试代码只比测试中的代码略长,而且大多数是测试,而不是管道。

  2. 感谢@gamaat让我再看看,boto 执行此操作in its own tests,在httplib中模拟实际的传输接口级别

  3. 模拟boto.dynamodb.layer1界面(以及boto.connect_dynamodb)证明是正确的做法。在boto.dynamodb.layer2boto.dynamodb.table设置间谍也有帮助。一旦我开始理解它,我发现mock是一种乐趣。

  4. Here's my solution,BSD许可。 我将把整个库发布到PyPI,一旦我把它编织了一段时间并整理了一些适当的文档。 I've posted it to PyPI.

答案 2 :(得分:3)

boto中的所有测试最初都是针对实时服务端点的集成测试。我们仍然有这些测试,但也开始添加模拟单元测试。你可能想看看到目前为止的例子。