并行启动测试时 Django 的“override_settings”装饰器如何工作

2024-03-02

我正在检查 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(使用前将#替换为@)

并行启动测试时 Django 的“override_settings”装饰器如何工作 的相关文章

随机推荐

  • 当 div 滚动到视口时淡入

    好的 所以我一直在寻找simple当用户将其滚动到视图中时淡入 div 的方法 但我找不到直接的解决方案 HTML div class container div class topdiv This is a 100 height div
  • C# - 无法在方法内声明委托

    我这里真的是一片空白 我在想why我无法在方法中声明委托类型 但我必须在类级别声明委托类型 namespace delegate learning class Program Works fine public delegate void
  • 静态内存实例中的字符串计数

    据我所知 编译时类似 C 的字符串仅作为一个实例保存在静态内存中 例如我两者都有true在 gcc 4 6 上运行下面的示例 但我想知道它是否总是如此并且可以便携 C 和 C 上的行为都很有趣 include
  • Spark如何执行join+filter?它具有可扩展性吗?

    假设我有两个大型 RDD A 和 B 包含键值对 我想使用密钥连接 A 和 B 但是在匹配的 a b 对中 我只想要一小部分 好 的 所以我进行连接并随后应用过滤器 A join B filter isGoodPair where isGo
  • Laravel 5.1 防止 CSRF 不匹配引发异常 [重复]

    这个问题在这里已经有答案了 我遇到向用户抛出 CSRF 异常的问题 发生这种情况的原因完全是无辜的 例如 如果有人在最 终提交表单时花了太长时间填写表单 则会话已过期并且令牌不匹配 现在显然这是一个错误 但它不需要杀死所有内容并抛出异常 有
  • 优化 Solr 的排序

    我正在使用 Solr 进行实时搜索索引 我的数据集大约有 60M 大文档 我需要按时间排序 而不是按相关性排序 目前 我在查询中使用排序标志按时间排序 这对于特定搜索效果很好 但是当搜索返回大量结果时 Solr 必须获取所有结果文档并在返回
  • RDD 中的分区数量和 Spark 中的性能

    在 Pyspark 中 我可以从列表创建 RDD 并决定有多少个分区 sc SparkContext sc parallelize xrange 0 10 4 我决定对 RDD 进行分区的分区数量如何影响性能 这与我的机器的核心数量有何关系
  • Java - 变量可能未初始化

    好的 所以无论我尝试什么 这个程序都无法工作 它只是一直说可变税可能未初始化 我可以拥有的唯一属性是收入 因此我无法申报高于此代码的税款 我发现如果我这样做的话 代码实际上可以被编译 显然这会导致数据过时 所以它没有用 请帮忙 public
  • 在编译时将文件复制到应用程序文件夹中

    如果我有一些文件想要从我的项目复制到 bin debug 编译时的文件夹 那么看来我必须将它们放入项目的根目录中 将它们放入子文件夹似乎将它们复制到 bin debug 文件夹的结构与它们存储的结构相同 有什么办法可以避免这种情况吗 只是要
  • Xcode 不兼容的指针类型

    语义问题 初始化时不兼容的指针类型NewCustomCell 带有类型的表达式UITableViewCell static NSString cellID customCell NewCustomCell cell tableView de
  • 从 C# 接口继承 XML 注释

    我想知道是否有人知道如何将接口 xml 注释链接到实现 问题是我希望基本评论首先来自我的界面 例子 interface myinterface
  • 我的 RestController 没有触发 @ControllerAdvice 和 @ExceptionHandler

    为了在整个应用程序中进行统一的异常处理 我正在使用使用 Spring 进行 REST 的错误处理 https www baeldung com exception handling for rest with spring解决方案 3 使用
  • MVC3 中的 POCO 类和 ViewModel

    我不是一名经验丰富的 MVC3 开发人员 但我正在努力成为一名经验丰富的 MVC3 开发人员 我熟悉 POCO 类和 ViewModel 因为前者描述了数据库的每个类 后者用于 mvc3 中的强类型视图 对于经验丰富的开发人员来说 我的问题
  • 用于插入、更新、删除后将数据按顺序输入日志表的 PL/SQL 触发器

    我正在解决家庭作业问题 我的触发器遇到了编译问题 并且无法理解如何创建引用序列和另一个表的触发器 并将这些值插入到我创建的日志表中 我读过 在表列条目上使用 SERIAL not null 可能会消除对序列和引用表的需要 http www
  • django:datediff sql 查询?

    我正在尝试在 Django 中执行与以下 SQL 等效的操作 SELECT FROM applicant WHERE date out date in gt 1 AND date out date in lt 6 我可以将其作为 RAW s
  • 将 div 扩展到滚动高度

    我需要扩展一个通过 css 将溢出设置为隐藏的 div 单击 展开 时 div 的高度将扩展到显示整个文本所需的高度 为了实现这一目标 我使用以下代码 expand click function mainDiv animate height
  • Safari/Chrome (Webkit) - 无法隐藏 iframe 垂直滚动条

    我有一个iframe在 www example com 上 指向 support example com 这是外部域的 CNAME 我自动调整 iframe 的高度 以便框架不需要任何滚动条来显示所包含的网页 在 Firefox 和 IE
  • 使用 stdin stdout 和 stderr 启动 exe/进程?

    使用 C 我如何使用 stdin stdout 和 stderr 启动 exe 进程 我知道如何在 NET 中执行此操作 我记得过去使用过 popen 但 popen 似乎允许 stdin 或 stdout 但不能同时使用 也不能全部使用
  • 如何在不使用 Amplify 的情况下使用 Amazon Cognito

    我现在刚刚开始研究 Cognito AWS 的设置相当简单 直接 我们有各种应用程序 网络应用程序和服务 我们希望它们能够使用 Cognito 服务 我有使用 Auth0 进行类似设置的经验 但由于我们一直在利用许多 Amazon Web
  • 并行启动测试时 Django 的“override_settings”装饰器如何工作

    我正在检查 Django 的设置模块是如何构建的以及如何覆盖设置 https docs djangoproject com en 3 2 topics testing tools django test override settings装