移除单元测试中的资源自动删除

Launchpad蓝图

https://blueprints.launchpad.net/neutron/+spec/remove-unit-test-autodeletion

此蓝图描述了移除单元测试中资源自动删除的理由。

问题描述

Neutron 单元测试目前使用 contextlib.contextmanager 装饰资源创建方法,以便在不再需要时自动删除资源。这种策略是过去需要显式清理以确保测试之间隔离的遗留问题,但现在已经不再必要,因为数据库状态会在每个测试后自动丢弃。这种策略对 Neutron 的大部分单元测试套件产生了以下负面影响:

  • 执行惩罚,因为每次创建的资源都会被删除,并且通过 wsgi 层执行。

  • 调试惩罚,因为 contextmanagers 是生成器,导致堆栈上下文丢失。

  • 可读性惩罚,因为测试代码充斥着围绕资源创建的不必要的 ‘with’ 块。

  • 覆盖率惩罚,因为隐式删除测试可能会掩盖资源删除测试中的漏洞。

提议的变更

资源创建方法应该修改为不执行自动删除,如下所示:

  • 移除 contextlib.contextmanager 装饰器

  • 将 ‘yield’ 语句更改为 ‘return’

  • 移除 do_delete 或 no_delete 参数

  • 移除删除资源(s)的条件块

此外,资源创建方法的所有客户端都应更新为不再传递 do_delete/no_delete 参数,并执行常规调用(例如 create_resource())而不是创建 with 块(例如 with create_resource():)。 此外,更新资源创建方法的名称也可能是有意义的,因为它们通常是 ‘resourcename’ 的形式,而不是 ‘create_resourcename’。

必须小心确保为给定资源类型添加显式删除测试,如果它们不存在。 自动删除确保了任何被测试创建的资源也会在某种程度上验证其删除,但这种验证现在必须是显式的。 从某种程度上说,这是可取的,因为依赖自动删除的“魔术”来提供测试覆盖率可能会让开发人员产生虚假的安全性。

也可能存在以依赖自动删除来防止唯一性约束违规的方式创建多个资源的测试。 在那些移除自动删除导致测试失败的情况下,需要执行显式删除。

备选方案

不移除自动删除的替代方案是继续忍受它带来的惩罚。

数据模型影响

REST API 影响

安全影响

通知影响

其他最终用户影响

性能影响

移除自动删除应该对单元测试套件的执行时间产生积极影响。

其他部署者影响

开发人员影响

熟悉当前单元测试中基于 contextmanager 的资源创建模型的开发人员和审查人员需要了解转向更简单的创建方法以及对显式测试删除的需求。

一个在移除 contextmanager 装饰器时提出的担忧是,它将不允许通过 contextlib.nested 管理多个资源的便利性。 如果需要,可以通过创建一个接受创建函数列表并确保创建的资源被清理的辅助方法来复制此功能。

实现

负责人

主要负责人

kevinbenton

其他贡献者

marun

工作项

  1. 为先前依赖自动删除执行隐式删除测试的资源类型添加显式删除测试。

  2. 禁用单元测试套件中每个资源创建方法(例如 NeutronDbPluginV2TestCase.network)中的自动删除,并修复由此产生的任何测试失败。

  3. 移除资源创建方法中的自动删除支持(参数、删除调用)并更新其调用者。

  4. 移除资源创建方法上的 contextmanager 装饰器,重命名创建方法(例如 network -> create_network),并更新其客户端。

依赖项

测试

文档影响

参考资料