【问题标题】:Managing Django test isolation for installable apps管理可安装应用程序的 Django 测试隔离
【发布时间】:2012-10-24 11:01:12
【问题描述】:

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

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

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

几个例子:

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

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

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

我的问题是:

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

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

注意:

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

【问题讨论】:

    标签: django django-testing


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案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

      【讨论】:

      • 谢谢。是的,看起来将测试放在已安装的软件包之外是可行的方法。
      猜你喜欢
      • 1970-01-01
      • 2016-03-10
      • 1970-01-01
      • 2020-06-19
      • 1970-01-01
      • 2014-12-18
      • 1970-01-01
      • 2021-04-18
      • 1970-01-01
      相关资源
      最近更新 更多