Django override_settings不能用于运行多个测试

时间:2017-01-06 04:26:29

标签: python django unit-testing django-rest-framework django-nose

使用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)

所以,如果我这样做......

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

设置已应用且效果很好!

但如果运行整个测试套件,如:

$ python manage.py test

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

环境: Python: 2.7 Django: 1.10

修改

我发现这个问题的解决方法是使用find来运行测试,它可以是别名或带有...的脚本。

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

缺点是许多测试的输出会在屏幕上堆积,并且可能会创建/破坏测试数据库几次。除非你使用django-nose在命令中添加选项,如REUSE_DB。

1 个答案:

答案 0 :(得分:4)

嗯,关于这种情况有一个warning

  

警告

     

设置文件包含一些仅供参考的设置   在Django内部的初始化期间。如果你改变它们   override_settings,如果您通过。访问它,则更改设置   但是,Django的内部访问它是django.conf.settings模块   不同。实际上,使用override_settings()或   使用这些设置的modify_settings()可能不会做什么   你希望它能做到。

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