【问题标题】:Testing for external resource consistency / skipping django tests测试外部资源一致性/跳过 django 测试
【发布时间】:2010-07-13 18:02:40
【问题描述】:

我正在为使用外部数据源的 Django 应用程序编写测试。显然,我使用假数据来测试我班级的所有内部工作,但我也想对实际的 fetcher 进行一些测试。其中之一将需要验证外部源仍在以我的应用程序期望的格式发送数据,这意味着请求在测试中检索该信息。

显然,我不希望我们的 CI 在出现网络问题时停机或数据提供者出现停机时间。在这种情况下,我想发出一个警告,跳过该测试方法的其余部分,并且不会导致整体失败。这样,如果数据成功到达,我可以检查它的一致性(如果有问题则失败),但如果无法获取数据,它会记录一个警告,以便我(或其他开发人员)知道快速检查数据源是否正常.

基本上,我想测试我的外部源而不依赖它!

Django 的测试套件使用 Python 的 unittest 模块(至少,我就是这样使用它的),它看起来很有用,因为它的文档描述了 Skipping tests and expected failures。此功能显然是“2.7 版中的新功能”,这解释了为什么我无法让它工作 - 我已经从控制台检查了我安装的 unittest 版本,它似乎是 1.63!

我在 pypi 中找不到更高版本的 unittest,所以 我想知道在哪里可以获得 that document 中描述的 unittest 版本,以及它是否适用于 Django (1.2)。强>

我显然愿意接受关于这是否是解决我的问题的最佳方法的建议/讨论 :)

[编辑 - 附加信息/澄清]

正如我所说,我显然是在嘲笑依赖关系并对此进行测试。但是,我还希望能够检查外部资源(通常是 API)是否仍然符合我的预期格式,如果存在网络问题或他们的服务器暂时关闭,则不会关闭 CI。我基本上只是想检查资源的一致性。

考虑以下情况...

如果您编写了 Twitter 应用程序,您将对应用程序的所有方法和行为进行测试 - 这些将使用虚假的 Twitter 数据。这为您的应用程序提供了一套完整、独立的测试。问题是这实际上并不能检查应用程序是否正常工作,因为您的应用程序本质上依赖于 Twitter API 的一致性。如果 Twitter 要更改 API 调用(可能更改 URL、参数或响应),即使单元测试仍然通过,应用程序也会停止工作。 (或者如果他们是completely switch off basic authentication!)

我的用例更简单——我有一个用于导入信息的 xml 资源。我伪造了资源并测试了我的导入代码,但我想要一个测试来检查那个 xml 资源的格式没有改变。

我的问题是关于跳过 Django 的测试运行器中的测试,因此如果资源不可用而测试失败,我可以发出警告,特别是获取支持此行为的 Python 的 unittest 模块版本。我提供了这么多背景信息,以便任何有此领域经验的人提供替代建议。

抱歉这个冗长的问题,我知道大多数人现在不会阅读此内容。 我已将重要部分“加粗”以使其更易于阅读。

【问题讨论】:

    标签: python django unit-testing skip


    【解决方案1】:

    我创建了一个单独的答案,因为您的编辑使我的上一个答案无效。

    我假设您在 Python 2.6 版上运行 - 我相信您在 unittest 中寻找的更改在 Python 2.7 版中可用。由于 unittest 在标准库中,更新到 Python 2.7 应该使您可以使用这些更改。这是一个适合你的选择吗?

    我可能建议的另一件事是将“外部源格式验证”测试分离到一个单独的测试套件中,并与其他单元测试分开运行。这样,您的核心单元测试仍然很快,您不必担心外部依赖项会破坏您的主要测试套件。如果您使用的是 Hudson,那么创建一个单独的作业来为您处理这些测试应该是相当容易的。只是一个建议。

    【讨论】:

    • 这正是我所追求的,谢谢。 (我在 2.6,是的)分离依赖项的有趣想法,我会考虑的,干杯。
    【解决方案2】:

    2.7 中 unittest 中的新功能已作为 unittest2 向后移植到 2.6。您只需 pip install 并将 unittest2 替换为 unittest ,您的测试将像您一样工作,而且您无需升级到 2.7 即可获得新功能。

    【讨论】:

    • 啊!太棒了,谢谢。与 Django 集成需要一些麻烦,但值得一看,干杯。
    【解决方案3】:

    你想测试什么?您的 Django 应用程序或依赖项中的代码?您可以模拟任何外部依赖项吗?如果您只是想测试您的 Django 应用程序,那么我会说模拟外部依赖项,因此您的测试不依赖于该外部资源的可用性。

    如果您可以发布一些“实际提取器”的代码,也许您会得到一些关于如何使用模拟的提示。

    【讨论】:

    • 您好,感谢您的回答。我编写 Django 测试没有问题。我的问题是最佳实践之一,并且(假设我的想法是有效的)有助于获得与 Django 集成的最新版本的单元测试。我将编辑我的问题以提供更多信息。
    猜你喜欢
    • 1970-01-01
    • 2013-05-19
    • 2011-04-13
    • 2018-12-02
    • 2020-05-13
    • 2018-03-25
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    相关资源
    最近更新 更多