【问题标题】:How do I test a module that depends on boto and an Amazon AWS service?如何测试依赖于 boto 和 Amazon AWS 服务的模块?
【发布时间】:2012-08-01 18:06:23
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: python testing mocking boto amazon-dynamodb


    【解决方案1】:

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

    【讨论】:

    • 同意。我认为嘲笑这项服务会比实际证明的要困难得多。这种鼓励正是我所需要的。
    • 大多数模拟/单元测试都是这样,在开始之前似乎要困难得多=)
    【解决方案2】:

    完整回答我的问题:

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

    2. 感谢@gamaat 让我再看一遍,boto 确实这样做了in its own tests,在httplib 中模拟实际传输接口级别。

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

    Here's my solution,BSD 许可。 我将把整个库发布到 PyPI 中,一旦我对它进行了更长时间的尝试并整理了一些适当的文档。 I've posted it to PyPI.

    【讨论】:

    • 虽然我完全同意模拟服务调用是正确的做法,但查看您的代码仍然看起来像模拟服务的大量开销。我希望有一个更好的模拟工具,没有所有的仪式设置。不过,感谢您提出这个问题,对于查看其他人的测试模式总是有帮助的。
    • @Syrahn 我和你在一起。我最近开始了解moto 项目。也许这会有所帮助?
    • 有支持boto3的moto3吗?
    【解决方案3】:

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

    【讨论】:

    • 链接会有所帮助,但通读 github.com/boto/boto/blob/develop/tests/unit 的 boto 测试代码,似乎模拟发生在 httplib 级别,这对 boto 来说是有意义的。
    • 初查boto的代码,只看到集成测试,心里很绝望。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-10
    • 2019-12-08
    • 2019-01-11
    • 2012-10-27
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    相关资源
    最近更新 更多