Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
管理可安装应用程序的Django测试隔离_Django_Django Testing - Fatal编程技术网

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

管理可安装应用程序的Django测试隔离,django,django-testing,Django,Django Testing,我维护一个可安装的Django应用程序,其中包括一个常规测试套件 很自然,当项目作者为他们的站点运行manage.py test时,他们自己的应用程序以及任何第三方安装的应用程序(如我的应用程序)的测试都将运行 我看到的问题是,在几种不同的情况下,用户特定的设置.py将包含导致我的应用程序测试失败的配置 举几个例子: 一些测试需要检查返回的错误消息。这些错误消息使用国际化框架,因此如果站点语言不是英语,则这些测试将失败 有些测试需要检查特定的模板输出。如果站点使用的是自定义模板(应用程序支持)

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

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

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

举几个例子:

  • 一些测试需要检查返回的错误消息。这些错误消息使用国际化框架,因此如果站点语言不是英语,则这些测试将失败
  • 有些测试需要检查特定的模板输出。如果站点使用的是自定义模板(应用程序支持),那么测试最终将使用自定义模板,而不是默认模板,测试将再次失败
为了避免这种情况,我想尝试找出一种合理的方法来隔离运行测试的环境

我目前的计划是让我所有的测试用例类扩展一个基本的测试用例,这个测试用例和我可能需要处理的任何其他环境设置

我的问题是:

  • 这是应用程序级测试环境隔离的最佳方法吗?有没有我错过的其他选择
  • 看起来我一次只能覆盖一个设置,而理想情况下,我可能需要一个完全干净的配置。有没有办法做到这一点,如果没有,我需要确保设置了哪些主要设置才能进行基本的清洁设置
  • 我相信我说的是正确的,因为实现细节和全局状态问题,覆盖某些设置(如
    已安装的应用程序
    )可能不会以预期的方式实际影响环境。这是正确的吗?我需要了解哪些设置,哪些全局缓存的环境信息可能不会像预期的那样受到影响
  • 除了设置之外,我还需要什么其他环境状态来确保是干净的
更一般地说,我也会对任何关于这对其他第三方可安装应用程序有多大影响的上下文感兴趣,或者是否有任何计划在core中进一步解决这些问题。我在IRC上看到过关于类似问题的对话,例如,Django的一些contrib应用程序在意外的设置和配置下运行。我似乎还记得在第三方应用程序和django contrib应用程序中也遇到过类似的情况,所以我觉得我并不是唯一一个面临此类问题的人,但目前还不清楚这是否需要更多的工作,或者现状是否足够好

请注意:

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

我见过Jezdez使用的一种很好的隔离方法是有一个名为
my_app.tests
的子模块,其中包含所有测试代码()。这意味着,当有人安装你的应用程序时,这些测试在默认情况下不会运行,因此不会出现随机的幻影测试失败,但如果他们想检查自己是否无意中破坏了某些东西,那么只需将
myapp.tests
添加到
INSTALLED\u APPS
以使其运行即可

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

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


嗯,整个运行的外部应用程序测试都被彻底破坏了。这当然不应该在默认情况下发生(也有关于这方面的讨论),甚至不应该是一件事——如果有人的外部应用程序测试套件被我的猴子补丁(或其他我不在乎的东西)破坏了——我绝对不希望它破坏我网站的构建。也就是说,上述方法允许那些不同意的人相当容易地运行它们。Jezdez可能拥有和其他人一样多的主要可插拔应用程序,即使他的方法存在一些微妙的问题,至少行为是一致的。

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

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

如果您想确保库中有特定的设置,只需编写使用这些设置值的测试用例

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

<