【问题标题】:Django override_settings won't work for running multiple testsDjango override_settings 不适用于运行多个测试
【发布时间】:2017-05-20 19:36:06
【问题描述】:

我在使用 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

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

环境: Python: 2.7 Django: 1.10

编辑:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    警告

    设置文件包含一些仅供参考的设置 在 Django 内部初始化期间。如果你用 override_settings,如果您通过 django.conf.settings 模块,然而,Django 的内部访问它 不同。有效地,使用 override_settings() 或 具有这些设置的 modify_settings() 可能不会做什么 你期望它会这样做。

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

    【讨论】:

    • 有办法解决这个问题吗??也许通过重新加载模块。
    • 您将不得不编写一个自定义测试运行器,但这并不容易
    • 此警告出现在 Django: 2.2 以及原帖中的版本中。
    猜你喜欢
    • 2018-03-29
    • 2017-04-05
    • 1970-01-01
    • 2021-07-21
    • 2021-07-07
    • 2014-08-04
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    相关资源
    最近更新 更多