考虑以下虚拟Resource
类:
import pytest
class Resource:
def __init__(self, param):
self.param = param
print "\nResource created", self.param, self
def __del__(self):
print "Resource deleted", self.param, self
它模拟了我想在每个测试用例之前创建的一些资源,并在测试用例之后完全取消初始化。使用旧式 funcargs,我编写了一个类似的测试
def pytest_funcarg__resource_fa(request):
res = Resource(request.param)
return res
def pytest_generate_tests(metafunc):
metafunc.parametrize("resource_fa", [1, 2], indirect=True)
def test_funcarg_resource(resource_fa):
print "Testcase: resource", resource_fa.param
当我运行时py.test -s -v
,我得到以下输出:
============================================ test session starts =============================================
platform linux2 -- Python 2.7.3 -- pytest-2.3.3 -- /usr/bin/python
plugins: cov
collected 2 items
test_factory.py:48: test_funcarg_resource[1]
Resource created 1 <test_factory.Resource instance at 0x292cab8>
Testcase: resource 1
PASSED
test_factory.py:48: test_funcarg_resource[2]
Resource created 2 <test_factory.Resource instance at 0x292cfc8>
Testcase: resource 2
PASSED
========================================== 2 passed in 0.01 seconds ==========================================
如您所见,这__del__
两个资源的 从未被调用过。如果我使用新型固定装置,则会观察到相同的行为:
@pytest.fixture(scope="function", params=[1, 2])
def resource_fx(request):
res = Resource(request.param)
return res
def test_fixture_resource(resource_fx):
print "Testcase: resource", resource_fx.param
当然,我可以添加一个自定义终结器并强制取消初始化 Resource 内需要取消初始化的任何内容,但这让我觉得有点多余——在测试之外,这__del__
足以确保 Resource 的内部得到正确释放,而我没有看看为什么Py.Test
需要保留res
对测试用例何时完成的任何引用。这是预期的行为Py.Test
,还是我应该提交错误?