This work is licensed under a Creative Commons Attribution 3.0 Unported License.
http://creativecommons.org/licenses/by/3.0/legalcode
资源清理¶
https://blueprints.launchpad.net/tempest/+spec/resource-cleanup
Tempest 测试资源清理
问题描述¶
在类级别测试fixture中创建/分配的测试资源的清理/释放是在类级别tearDown fixture中调用的。但是,unittest框架仅在setUpClass成功的情况下才会调用tearDownClass。这导致资源在以下情况下泄漏:
在已经分配了资源(通常是测试帐户)之后,引发了跳过异常
被测系统中出现临时故障,导致setUpClass失败
test-accounts bp 引入了使用配置的预置测试帐户列表来并行运行测试的可能性。测试帐户由每个测试类分配和释放,并且未能释放会导致测试帐户耗尽。
提议的变更¶
禁止使用hacking rule覆盖setUpClass在BaseTestCase中定义的内容。定义setUpClass,使其调用一个(或多个)其他方法,这些方法将被后代类覆盖。使用@safe_setup装饰器对其进行装饰。这样,tearDownClass将始终被调用。
@classmethod
@safe_setup
def setUpClass(cls):
cls.setUpClassCalled = True
cls.resource_setup()
在进行此更改时,可以通过将设置结构化为一系列方法来获得额外的好处,以强制在失败之前分配尽可能少的资源,从而也能快速清理。
此PoC在此处提供:https://review.openstack.org/#/c/115353。
@classmethod
@safe_setup
def setUpClass(cls):
cls.setUpClassCalled = True
# All checks that may generate a skip
cls.setup_skip_checks()
# Any setup code that does not require / generate test resources
cls.setup_pre_resources()
# Allocation of all required credentials
cls.setup_allocate_credentials()
# Shortcuts to clients
cls.setup_clients()
# Allocation of shared test resources
cls.setup_create_resources()
# Any setup code to be run after resource allocation
cls.setup_post_resources()
tearDownClass fixture需要在多个地方进行修复,因为一些tearDownClass实现将变得不安全,因为它们期望在setUpClass期间定义的属性,而这些属性可能不再存在。
禁止使用hacking rule覆盖tearDownClass在BaseTestCase中定义的内容。定义tearDownClass,使其调用后代类特定的清理代码,最后清理凭据。
@classmethod
def tearDownClass(cls):
at_exit_set.discard(cls)
try:
cls.resource_cleanup()
finally:
cls._cleanup_credentials() # Defined in BaseTestCase
替代方案¶
已经确定了两种替代方案。
大规模fixture装饰¶
使用@safe_setup装饰所有setUpClass实现,并使用@safe_teardown装饰所有tearDownClass实现。这种方法需要对tempest进行大规模更改,其优点是可以几乎通过脚本实现(PoC:https://review.openstack.org/#/c/115123/)。它的缺点是需要每个新的测试类添加这两个装饰器。
迁移到TestResources¶
这在长期来看可能仍然是一个选项,但目前迁移的工作量将大于从中获得的收益。无论如何,仍然需要额外的工程工作来确保资源的清理。
实现¶
负责人¶
Andrea Frittoli <andrea.frittoli@hp.com>
里程碑¶
- 完成目标里程碑
Juno-final
工作项¶
定义基础fixture
迁移基础类和测试以使用新的框架(多个补丁)工作跟踪在https://etherpad.openstack.org/p/tempest-resource-cleanup
禁止覆盖setUpClass和tearDownClass的hacking rule
依赖项¶
无