Django的override_settings将无法运行多个测试

And*_*ato 5 python django unit-testing django-nose django-rest-framework

使用override_settings装饰器时,我的行为有些奇怪。当我单独运行测试时,它基本上可以工作,但是如果运行整个测试套件,则无法工作。

在此测试中,我更改了REST_FRAMEWORK选项,因为在运行此套件时,我想设置身份验证设置,而其他测试则不使用身份验证:

@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)
Run Code Online (Sandbox Code Playgroud)

所以如果我...

$ python manage.py test myapp/tests/test_auth.py

设置已应用且效果很好!

但是如果像这样运行整个测试套件:

$ python manage.py test

测试将失败。在我看来,这些设置(或某些对象)正在从其他测试中缓存。我在另一个以类似方式使用Client实例的测试文件中还有另一个类。

环境: Python: 2.7 Django: 1.10

编辑:

我发现此问题的解决方法是使用查找来运行测试,它可以是别名或具有...的脚本。

find . -name 'test*.py' -exec python manage.py test {} \;

缺点是许多测试的输出堆积在屏幕上,并且可能会多次创建/销毁测试数据库。除非您使用django-nose将选项添加到REUSE_DB之类的命令中。

e4c*_*4c5 5

好吧,这是一个警告

警告

设置文件包含一些设置,这些设置仅在Django内部初始化期间进行查询。如果使用override_settings对其进行更改,则通过django.conf.settings模块访问该设置会更改该设置,但是,Django内部访问它的方式有所不同。实际上,对这些设置使用override_settings()或modify_settings()可能不会实现您期望的效果。

第一次运行测试时,您正在运行特定的测试用例,因此覆盖生效。第二次运行测试时,您正在运行整个套件,而特定的测试用例可能不是第一个正在运行的。因此,上述情况发生了。