2

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

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

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

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

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

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

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

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

考虑以下情况...

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

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

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

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

4

3 回答 3

1

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

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

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

于 2010-07-14T11:17:58.183 回答
1

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

于 2010-09-11T05:40:39.633 回答
0

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

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

于 2010-07-13T18:08:58.353 回答