如何测试一个依赖于boto和亚马逊AWS服务的模块



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

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

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

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

  1. 我这样做对吗
  2. 其他人做过这个吗
  3. boto.dynamodb接口中是否有任何特定点最适合模拟

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

要完整回答我的问题:

  1. 正如@pcalcao的回答一样,嘲笑服务是正确的做法。它甚至没有我想象的那么难——测试代码只比测试中的代码长一点,而且大部分都是测试,而不是管道。

  2. 感谢@gamaat让我重新审视一下,boto在自己的测试中做到了这一点,在httplib中嘲笑实际的传输接口级别。

  3. 模拟boto.dynamodb.layer1接口(以及boto.connect_dynamodb)是正确的做法。在boto.dynamodb.layer2boto.dynamodb.table上设置间谍也有帮助。当我开始理解它时,我发现mock是一种工作的乐趣。

这是我的解决方案,BSD许可

我会把整个库发布到PyPI,一旦我把它养得更长一点,并整理一些合适的文档我已经把它发布到PyPI了。

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

最新更新