django - 管理可安装应用程序的 Django 测试隔离

标签 django django-testing

我维护一个可安装的 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 用于测试。

最佳答案

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

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

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

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

关于django - 管理可安装应用程序的 Django 测试隔离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13047882/

相关文章:

django - 如何启动 Django 可重用应用程序的测试?

Django UnitTest - 设置 session 变量

python - DetailView 模板不显示其数据

python - 为什么在 Django 中使用线程局部变量不好?

python - 在 django 模板中解析和排序 csv 文件

python - 使用 Django/HTML/Python 不显示表单

python - 如何防止 pytest 删除测试用例之间的数据库记录?

python - 在 gitlab ci 上运行 django 测试

django - 在没有服务中断/没有停机的情况下部署 Django 应用程序

DjangoModelFactory JsonField 返回 Unicode 数据而不是字典数据