14

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

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

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

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

  1. 我会以正确的方式解决这个问题吗?
  2. 有没有其他人这样做过?
  3. boto.dynamodb界面中是否有最适合模拟的特定点?
4

3 回答 3

4

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

于 2012-08-01T18:14:19.767 回答
4

完整回答我的问题:

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

  2. 感谢@gamaat 让我再看一遍,boto在它自己的测试中确实做到了这一点,在实际传输接口级别进行模拟,在.httplib

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

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

于 2012-08-02T13:22:08.777 回答
3

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

于 2012-08-01T22:47:13.110 回答