Django override_settings 不适用于 运行 多项测试
Django override_settings won't work for running multiple tests
我在使用 override_settings
装饰器时出现了一些奇怪的行为。当我单独 运行 测试时它基本上可以工作,但如果我 运行 整个测试套件就不会工作。
在这个测试中,我正在更改 REST_FRAMEWORK
选项,因为当 运行ning 这个套件时,我想设置身份验证设置,而其他测试不使用身份验证:
@override_settings(REST_FRAMEWORK=AUTH_REST_FRAMEWORK)
class AuthTestCase(TestCase):
@classmethod
def setUpClass(cls):
super(AuthTestCase, cls).setUpClass()
cls.client = Client()
def test_i_need_login(self):
response = client.get('/')
self.assertEqual(response.status_code, 401)
所以如果我这样做...
$ python manage.py test myapp/tests/test_auth.py
设置已应用并且效果很好!
但是如果 运行 整个测试套件像:
$ python manage.py test
测试将失败。在我看来,这些设置(或某些对象)是从其他测试中缓存的。我在另一个以类似方式使用 Client 实例的测试文件中还有另一个 class 。
环境:
Python: 2.7
Django: 1.10
编辑:
我发现这个问题的解决方法是使用 find 来 运行 测试,它可以是别名或带有...
的脚本
find . -name 'test*.py' -exec python manage.py test {} \;
缺点是许多测试的输出堆积在屏幕上,它可能 create/destroy 测试数据库几次。除非你在使用 django-nose 时向命令添加选项,如 REUSE_DB。
嗯,有一个关于这种情况的 warning。
Warning
The settings file contains some settings that are only consulted
during initialization of Django internals. If you change them with
override_settings, the setting is changed if you access it via the
django.conf.settings module, however, Django’s internals access it
differently. Effectively, using override_settings() or
modify_settings() with these settings is probably not going to do what
you expect it to do.
第一次 运行 测试时,您是在 运行 一个特定的测试用例,因此覆盖生效。第二次 运行 测试时,您正在 运行 整个套件,而您的特定测试用例可能不是第一个 运行。所以发生了以上情况。
我在使用 override_settings
装饰器时出现了一些奇怪的行为。当我单独 运行 测试时它基本上可以工作,但如果我 运行 整个测试套件就不会工作。
在这个测试中,我正在更改 REST_FRAMEWORK
选项,因为当 运行ning 这个套件时,我想设置身份验证设置,而其他测试不使用身份验证:
@override_settings(REST_FRAMEWORK=AUTH_REST_FRAMEWORK)
class AuthTestCase(TestCase):
@classmethod
def setUpClass(cls):
super(AuthTestCase, cls).setUpClass()
cls.client = Client()
def test_i_need_login(self):
response = client.get('/')
self.assertEqual(response.status_code, 401)
所以如果我这样做...
$ python manage.py test myapp/tests/test_auth.py
设置已应用并且效果很好!
但是如果 运行 整个测试套件像:
$ python manage.py test
测试将失败。在我看来,这些设置(或某些对象)是从其他测试中缓存的。我在另一个以类似方式使用 Client 实例的测试文件中还有另一个 class 。
环境:
Python: 2.7
Django: 1.10
编辑:
我发现这个问题的解决方法是使用 find 来 运行 测试,它可以是别名或带有...
的脚本find . -name 'test*.py' -exec python manage.py test {} \;
缺点是许多测试的输出堆积在屏幕上,它可能 create/destroy 测试数据库几次。除非你在使用 django-nose 时向命令添加选项,如 REUSE_DB。
嗯,有一个关于这种情况的 warning。
Warning
The settings file contains some settings that are only consulted during initialization of Django internals. If you change them with override_settings, the setting is changed if you access it via the django.conf.settings module, however, Django’s internals access it differently. Effectively, using override_settings() or modify_settings() with these settings is probably not going to do what you expect it to do.
第一次 运行 测试时,您是在 运行 一个特定的测试用例,因此覆盖生效。第二次 运行 测试时,您正在 运行 整个套件,而您的特定测试用例可能不是第一个 运行。所以发生了以上情况。