测试外部资源一致性 / 跳过Django测试
我正在为一个使用外部数据源的Django应用写测试。显然,我会用假数据来测试我类的内部逻辑,但我也想为实际的数据获取器写几个测试。其中一个需要验证外部数据源是否仍然按照我应用所期望的格式发送数据,这就意味着在测试中要发起请求来获取这些信息。
显然,我不想因为网络问题或数据提供者暂时宕机而导致我们的持续集成(CI)崩溃。在这种情况下,我希望能抛出一个警告,跳过该测试方法的其余部分,而不影响整体测试结果。这样,如果数据成功到达,我就可以检查它的一致性(如果有问题就失败),但如果数据无法获取,就会记录一个警告,这样我(或其他开发者)就知道要快速检查数据源是否正常。
基本上,我想测试我的外部数据源,但又不想完全依赖它!
Django的测试套件使用的是Python的unittest模块(至少,我是这么用的),这个模块看起来很有用,因为它的文档中描述了跳过测试和预期失败。这个功能显然是“在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模块的版本。我提供了这么多背景信息,希望有经验的人能提供其他建议。
抱歉问题有点长,我知道大多数人现在可能不会读完。 我已经将重要部分加粗,以便更容易阅读。
3 个回答
你想测试什么呢?是你Django应用里的代码,还是某个依赖的部分?你能不能把那个外部依赖给模拟一下?如果你只是想测试你的Django应用,那我建议你模拟那个外部依赖,这样你的测试就不需要依赖那个外部资源是否可用。
如果你能发一些你实际获取数据的代码,或许大家能给你一些关于如何使用模拟的建议。
在2.7版本的unittest中新增的功能已经被移植到2.6版本,叫做unittest2。你只需要用pip安装unittest2,然后把unittest替换成unittest2,你的测试就可以像之前一样正常运行,而且还能享受到新功能,而不需要升级到2.7版本。
我单独写了这个回答,因为你的编辑让我的上一个回答不再有效。
我猜你在用Python 2.6版本。我觉得你想要的unittest的改动在Python 2.7版本中才有。因为unittest是标准库的一部分,升级到Python 2.7应该就能让你用上这些改动。这样做对你来说可行吗?
还有一个建议,就是把“外部源格式验证”的测试分成一个单独的测试套件,和其他单元测试分开运行。这样你的核心单元测试就能保持快速,而且你也不用担心外部依赖会影响到你的主要测试套件。如果你在用Hudson,创建一个单独的任务来处理这些测试应该会比较简单。这只是个建议。