【发布时间】: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