我正在围绕boto.dynamodb.layer2
编写一个非常小的Python ORM。我想为它编写测试,但我不希望测试真正与AWS通信,因为这需要复杂的设置、凭据、网络访问等。
由于我计划开源该模块,在源代码中包含凭据似乎是个坏主意,因为我将收取使用费,而在环境中包含凭据是一件痛苦的事情。
将我的测试耦合到网络似乎是个坏主意,因为这会使测试运行速度变慢,或者可能导致测试由于网络错误或限制而失败。我的目标不是测试boto的DynamoDB接口或AWS。我只想测试我自己的代码。
我计划使用unittest2
来编写测试,使用mock
来模拟僵尸网络中的部分,但我以前从未这样做过,所以我的问题归结为:
- 我这样做对吗
- 其他人做过这个吗
boto.dynamodb
接口中是否有任何特定点最适合模拟
我认为你有正确的方法,你绝对不希望你的测试与AWS的实际通信联系在一起。在这里嘲笑服务绝对是正确的做法。
要完整回答我的问题:
-
正如@pcalcao的回答一样,嘲笑服务是正确的做法。它甚至没有我想象的那么难——测试代码只比测试中的代码长一点,而且大部分都是测试,而不是管道。
-
感谢@gamaat让我重新审视一下,boto在自己的测试中做到了这一点,在
httplib
中嘲笑实际的传输接口级别。 -
模拟
boto.dynamodb.layer1
接口(以及boto.connect_dynamodb
)是正确的做法。在boto.dynamodb.layer2
和boto.dynamodb.table
上设置间谍也有帮助。当我开始理解它时,我发现mock
是一种工作的乐趣。
这是我的解决方案,BSD许可
boto中的所有测试最初都是命中实时服务端点的集成测试。我们仍然有这些测试,但也已经开始添加模拟单元测试。你可能想看看到目前为止的例子。