在django 1.5及更早版本中,默认情况下,运行python manage.py test
将运行项目中的所有测试(包括django.contrib中的所有测试)。版本1.6之后,默认行为是运行当前目录中的所有测试。
使用或不使用django.contrib测试运行所有测试的最佳方式(v 1.6)是什么?
答案 0 :(得分:15)
Django 1.6 changed the default test runner来:
TEST_RUNNER = 'django.test.runner.DiscoverRunner'
您可以通过添加 settings.py :
来恢复旧行为TEST_RUNNER = 'django.test.simple.DjangoTestSuiteRunner'
如发行说明中所述:
前一个运行器(django.test.simple.DjangoTestSuiteRunner)仅在INSTALLED_APPS中的Python包的models.py和tests.py模块中找到了测试。
新的运行器(django.test.runner.DiscoverRunner)使用unittest2内置的测试发现功能(Python 2.7+标准库中的unittest版本,与Django捆绑在一起)。通过测试发现,测试可以位于名称与模式测试* .py。
匹配的任何模块中
新的跑步者需要一个模块的虚线路径列表,其中应该发现测试,因此您也可以通过这种方式从django contrib
运行测试:
python manage.py test myproject django.contrib path.to.someotherapp
这将不自动运行INSTALLED_APPS
中应用的所有测试。对于更复杂的解决方案,您可以编写自己的跑步者,从新老跑步者那里获取。
另请注意,通常不需要从django.contrib
运行测试,因为这些测试不是测试您的应用程序,而是测试Django分发。 Django提供了更多的测试,这些测试都不是由跑步者运行的。
答案 1 :(得分:0)
令人遗憾的是,Django决定忽略INSTALLED_APPS中不在项目树中的自定义应用程序。请参阅此帖子https://groups.google.com/forum/#!topic/django-users/gGfVhfrfE10了解其原因。
我的真实案例当然不属于上述三个用例(非常大惊小怪!):我们有一个网站,我们为客户/客户群提供了一系列紧密耦合的自定义应用程序。我们不希望希望这些应用程序嵌套在项目树下,因为每个应用程序都在自己的git repo中。在过去,我们使用了git子模块,伪子模块和子树;在我们的设置中都有他们的问题。另一方面,将每个应用程序作为自己的包在与站点相同的级别上满足我们的大部分要求。
当然每个应用程序都有自己的测试,但我希望能够为每个特定的不同构成的站点运行完整的测试套件(包括网站和所有自定义应用程序)。
我们的解决方法如下:
在settings/test.py
我有:
ATA_BLACKLIST = ['scary_mod1', 'scary_mod2']
ADD_TEST_APPS = [i for i in INSTALLED_APPS
if '.' not in i and i not in ATA_BLACKLIST]
ATA_STR = " ".join(ADD_TEST_APPS)
我在顶级有一个run_tests.sh
脚本,看起来或多或少是这样的:
#!/bin/bash
MYDIR=`dirname $0`
cd $MYDIR
DJANGO_SETTINGS_MODULE=kmxng.settings.test
ATA_STR=`python -c "from django.conf import settings; print settings.ATA_STR"`
coverage run --omit "*lib/python*" ./manage.py test . $ATA_STR
coverage report
简而言之,在我的测试设置中,我生成了一个应添加到测试中的额外模块列表。除了默认的test
之外,我还使用该列表调用django .
命令。
(我确实看过覆盖DiscoverRunner
- 它有一个相对较长的build_suite
方法可以被覆盖。上面的解决办法是一种侵入性较小的选项。)