Hello guys,I remember early in development we decided to abort the execution when `setUp` fails without executing `tearDown`, but over the time I keep thinking about it and I don't think it's optimal. My main reason is to simplify `setUp` code, let me demonstrate it on an example.
Currently when you (safely) want to get a few remote servers, nfs share and local service, you have to:
class MyTest(test):
def setUp(self):
self.nfs_share = None
self.remote_servers = []
self.service = None
try:
for addr in self.params.get("remote_servers"):
self.remote_servers.append(login(addr))
self.nfs_share = get_nfs_share()
self.service = get_service()
except:
for server in self.remote_servers:
server.close()
if self.nfs_share:
self.nfs_share.close()
if self.service:
self.service.stop()
raise
def tearDown(self):
if self.nfs_share:
self.nfs_share.close()
for server in self.remote_servers:
server.close()
if self.service:
self.service.stop()
But if the tearDown was also executed, you'd simply write:
class MyTest(test):
def setUp(self):
self.nfs_share = None
self.remote_servers = []
self.service = None
for addr in self.params.get("remote_servers"):
self.remote_servers.append(login(addr))
self.nfs_share = get_nfs_share()
self.service = get_service()
def tearDown(self):
if self.nfs_share:
self.nfs_share.close()
for server in self.remote_servers:
server.close()
if self.service:
self.service.stop()
As you can see the current solution requires catching exceptions and
basically writing the tearDown twice. Yes, properly written tearDown
could be manually executed from the `setUp`, but that looks a bit odd
and my experience is that people usually just write:
class MyTest(test):
def setUp(self):
self.remote_servers = []
for addr in self.params.get("remote_servers"):
self.remote_servers.append(login(addr))
self.nfs_share = get_nfs_share()
self.service = get_service()
def tearDown(self):
self.nfs_share.close()
for server in self.remote_servers:
server.close()
self.service.stop()
which usually works but when the `get_nfs_share` fails, the
remote_servers are not cleaned, which might spoil the following tests
(as they might be persistent, eg. via aexpect).
Kind regards, LukášPS: Yes, the tearDown is unsafe as when `nfs_share.close()` fails the rest is not cleaned up. This is just a demonstration and the proper tearDown and a proper setUp for the current behavior would be way more complex.
signature.asc
Description: OpenPGP digital signature
