3

我维护一个可安装的 Django 应用程序,其中包括一个常规测试套件。

当项目作者为他们的站点运行时,自然而然manage.py test地,他们自己的应用程序以及任何第三方安装的应用程序(例如我的应用程序)的测试都将运行。

我看到的问题是,在几种不同的情况下,用户的特定settings.py信息将包含导致我的应用程序测试失败的配置。

几个例子:

  • 一些测试需要检查返回的错误信息。这些错误消息使用国际化框架,因此如果站点语言不是英语,那么这些测试将失败。
  • 一些测试需要检查特定的模板输出。如果站点正在使用自定义模板(应用程序支持),那么测试将最终使用他们的自定义模板而不是默认模板,并且测试将再次失败。

我想尝试找出一种明智的方法来隔离我的测试运行的环境,以避免这种情况。

我目前的计划是让我所有的 TestCase 类扩展一个基本的 TestCase,它会覆盖 settings以及我可能需要处理的任何其他环境设置。

我的问题是:

  • 这是应用程序级测试环境隔离的最佳方法吗?有没有我错过的替代方案?
  • 看起来我一次只能覆盖一个设置,理想情况下我可能想要一个完全干净的配置。有没有办法做到这一点,如果没有,我需要确保设置哪些主要设置才能进行基本的干净设置?
  • 我相信我的说法是正确的,INSTALLED_APPS由于实现细节和全局状态问题,覆盖某些设置可能实际上不会以预期的方式影响环境。它是否正确?我需要注意哪些设置,哪些全局缓存的环境信息可能不会按预期受到影响?
  • 除了设置之外,我还需要确保什么其他环境状态是干净的?

更一般地说,我也对任何关于这对于其他第三方可安装应用程序有多大问题的上下文感兴趣,或者是否有任何计划进一步解决核心问题。我在 IRC 上看到过关于类似问题的对话,例如。一些 Django 的 contrib 应用程序在意外的设置配置下运行。我似乎还记得几次使用第三方应用程序和 django contrib 应用程序都遇到过类似的情况,所以感觉我并不是唯一一个面临此类问题的人,但目前尚不清楚是否就这是否达成共识需要更多工作或现状是否足够好的事情。

注意:

  • 这些是集成级别的测试,所以我想在全局级别解决这些环境问题。
  • 我需要支持 Django 1.3,但可以放入一些兼容性包装器,只要我不重新实现大量 Django 代码。
  • 显然,由于这是一个可安装的应用程序,我不能只指定我自己DJANGO_SETTINGS_MODULE的用于测试。
4

2 回答 2

3

我看到 Jezdez 使用的一种很好的隔离方法是调用my_app.tests一个包含所有测试代码(示例)的子模块。这意味着当有人安装您的应用程序时,默认情况下不会运行这些测试,因此他们不会得到随机幻像测试失败,但如果他们想检查他们是否没有无意中破坏某些东西,那么它就像添加myapp.testsINSTALLED_APPS获取一样简单它运行。

在测试中,您可以尽最大努力确保使用正确的环境存在override_settings(如果这不在 1.4 中,则没有那么多代码)。我个人的感觉是,对于集成类型测试,它们是否失败可能并不重要。如果您愿意,您可以包含一个干净的设置文件 ( compressor.test_settings),这对于主要项目可能更合适。

另一种方法是您将测试分开一点 - 有两个独立的测试主体,用于contrib.admin,位于django.contrib.admin.tests和位于tests.regression_tests.contrib.admin(或类似路径)的测试。检查公共 api 和核心功能的那些(应该)位于第一个,而任何可能被其他人的(合理的)配置破坏的东西都位于第二个。

恕我直言,整个运行的外部应用程序测试完全被破坏了。它当然不应该默认发生(并且有关于这种情况的讨论),它甚至不应该是一件事 - 如果有人的外部应用程序测试套件被我的猴子补丁(或其他什么)破坏了,我实际上并不关心 -而且我绝对不希望它破坏我网站的构建。也就是说,上述方法允许那些不同意的人相当容易地运行它们。Jezdez 可能拥有与其他任何人一样多的主要可插拔应用程序,即使他的方法存在一些微妙的问题,至少也存在行为一致性。

于 2012-10-24T11:16:59.723 回答
2

由于您正在发布一个可重用的第三方应用程序,我看不出使用该应用程序的开发人员应该更改代码的任何理由。如果代码没有改变,开发人员不需要运行你的测试。

最好的解决方案,IMO,是让测试位于可安装包之外。当您安装 Django 并运行manage.py tests时,您不会运行 Django 测试套件,因为您相信您安装的 Django 版本是稳定的。对于使用您的第三方应用程序的开发人员来说,这应该是相同的。

如果有特定设置要确保您的库正常工作,只需编写使用这些设置值的测试用例。

这是一个可重用的 django 应用程序示例,它的测试位于已安装的包之外:

https://github.com/Yipit/django-roughage/tree/master

这是一种开发python模块的流行方式,如下所示:

https://github.com/kennethreitz/requests

https://github.com/getsentry/sentry

于 2012-10-24T15:02:31.917 回答