我正在检查 Django 的设置模块是如何构建的以及如何覆盖设置 https://docs.djangoproject.com/en/3.2/topics/testing/tools/#django.test.override_settings装饰器在测试时处理设置,我只是看不出如何执行 https://github.com/django/django/blob/main/django/test/utils.py#L441这个装饰器可以避免并行运行测试时出现问题。
我看到它在enable
它分配给设置的方法'_wrapped
属性应用了更改的设置值,并且它存储了先前值的副本,然后将其恢复到disable
方法。当我连续执行它时,这对我来说效果很好。但是,当并行运行测试时,我无法看到这是如何在不影响也使用装饰器的其他测试的情况下工作的,比如说覆盖相同的值。我看到的是,访问settings.OVERRIDDEN_SETTING时,最新执行的测试设置的值将在各处返回。事实上,此设置覆盖也应该影响其他测试中返回的值,即使它们没有被修饰。
我的意思是,如果我们有这两个测试:
@override_settings(SETTING=1):
def test_1(self):
...
...
print(settings.SETTING)
@override_settings(SETTING=2):
def test_2(self):
...
...
print(settings.SETTING)
def test_3(self):
...
...
print(settings.SETTING)
如果它们并行运行,假设test_1
被执行,开始执行它的代码,同时test_2
在之前被调用print
中的声明test_1
已执行,通过检查装饰器实现,我希望它们都打印2
作为他们的结果print
。取决于它何时被执行,test_3
如果也并行运行,将返回原始值 1 或 2。
一定有一些我没有考虑到的事情,因为我不认为这段代码在呆了这么长时间之后容易出现这种竞争条件。
任何帮助理解这一点的帮助将不胜感激。
并行测试分别运行流程,每个访问自己的副本settings
.
因此,姜戈的override_settings
不需要专门处理并行测试。
我们可以凭经验验证,用不安全的直接修改而不是override_settings
(注意sleep
为了保证test_3
追赶test_1
and test_2
修改值):
from time import sleep
from django.conf import settings
from django.test import TestCase
class TestOverrideSettings1(TestCase):
# @override_settings(SETTING=1)
def test_1(self):
settings.SETTING = 1
print(settings.SETTING)
class TestOverrideSettings2(TestCase):
# @override_settings(SETTING=2)
def test_2(self):
settings.SETTING = 2
print(settings.SETTING)
class TestOverrideSettings3(TestCase):
def test_3(self):
sleep(1)
print(settings.SETTING)
运行测试:
$ python manage.py test
1
.2
.2
.
并行运行测试:
$ python manage.py test --parallel
1
2
..0
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)