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

Dav*_*Eyk 14 python testing mocking boto amazon-dynamodb

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

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

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

我打算用来unittest2编写测试并mock模拟出击中网络的boto部分,但我以前从未这样做过,所以我的问题可以归结为:

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

Dav*_*Eyk 4

完整回答我的问题:

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

  2. 感谢 @gamaat 让我再看一遍,boto确实在自己的测试中做到了这一点,在.httplib

  3. 事实证明,模拟boto.dynamodb.layer1接口(以及boto.connect_dynamodb)是正确的做法。设置间谍boto.dynamodb.layer2boto.dynamodb.table有帮助。一旦我开始理解它,我发现与之mock合作是一种乐趣。

这是我的解决方案,BSD 许可。一旦我对它进行了更长的测试并整理了一些适当的文档,我就会将整个库发布到 PyPI。 我已经将其发布到 PyPI 了。

  • @Syrahn 我和你在一起。我最近意识到 [moto](https://pypi.python.org/pypi/moto/) 项目。也许这会有帮助? (4认同)